* Directly open file handle in Windows.
* Directly open file handle on Unix.
* Dispose FileHandle.
* Update scope of using.
using System.IO;
using System.Threading.Tasks;
using System.Runtime.Versioning;
+using Microsoft.Win32.SafeHandles;
namespace System.Net.Sockets
{
{
CheckTransmitFileOptions(flags);
+ SocketError errorCode = SocketError.Success;
+
// Open the file, if any
// Open it before we send the preBuffer so that any exception happens first
- FileStream? fileStream = OpenFile(fileName);
-
- SocketError errorCode = SocketError.Success;
- using (fileStream)
+ using (SafeFileHandle? fileHandle = OpenFileHandle(fileName))
{
// Send the preBuffer, if any
// This will throw on error
}
// Send the file, if any
- if (fileStream != null)
+ if (fileHandle != null)
{
// This can throw ObjectDisposedException.
- errorCode = SocketPal.SendFile(_handle, fileStream);
+ errorCode = SocketPal.SendFile(_handle, fileHandle);
}
}
private void SendFileInternal(string? fileName, ReadOnlySpan<byte> preBuffer, ReadOnlySpan<byte> postBuffer, TransmitFileOptions flags)
{
- // Open the file, if any
- FileStream? fileStream = OpenFile(fileName);
-
SocketError errorCode;
- using (fileStream)
- {
- SafeFileHandle? fileHandle = fileStream?.SafeFileHandle;
+ // Open the file, if any
+ using (SafeFileHandle? fileHandle = OpenFileHandle(fileName))
+ {
// This can throw ObjectDisposedException.
errorCode = SocketPal.SendFile(_handle, fileHandle, preBuffer, postBuffer, flags);
}
using System.Runtime.Versioning;
using System.Threading;
using System.Threading.Tasks;
+using Microsoft.Win32.SafeHandles;
namespace System.Net.Sockets
{
partial void ValidateForMultiConnect(bool isMultiEndpoint);
// Helper for SendFile implementations
- private static FileStream? OpenFile(string? name) => string.IsNullOrEmpty(name) ? null : File.OpenRead(name);
+ private static SafeFileHandle? OpenFileHandle(string? name) => string.IsNullOrEmpty(name) ? null : File.OpenHandle(name, FileMode.Open, FileAccess.Read);
private void UpdateReceiveSocketErrorForDisposed(ref SocketError socketError, int bytesTransferred)
{
return errorCode;
}
- public static SocketError SendFile(SafeSocketHandle handle, FileStream fileStream)
+ public static SocketError SendFile(SafeSocketHandle handle, SafeFileHandle fileHandle)
{
long offset = 0;
- long length = fileStream.Length;
-
- SafeFileHandle fileHandle = fileStream.SafeFileHandle;
-
+ long length = RandomAccess.GetLength(fileHandle);
long bytesTransferred = 0;
if (!handle.IsNonBlocking)