private FileStream TryCreateFileStream(bool allowConcurrentWrite) { FileShare fileShare = FileShare.Read; if (allowConcurrentWrite) { fileShare = FileShare.ReadWrite; } #if !NET_CF if (this.CreateFileParameters.EnableFileDelete && PlatformDetector.GetCurrentRuntimeOS() != RuntimeOS.Windows) { fileShare |= FileShare.Delete; } #endif #if !NET_CF && !SILVERLIGHT if (PlatformDetector.IsCurrentOSCompatibleWith(RuntimeOS.WindowsNT) || PlatformDetector.IsCurrentOSCompatibleWith(RuntimeOS.Windows)) { return(this.WindowsCreateFile(this.FileName, allowConcurrentWrite)); } #endif return(new FileStream( this.FileName, FileMode.Append, FileAccess.Write, fileShare, this.CreateFileParameters.BufferSize)); }
private FileStream WindowsCreateFile(string fileName, bool allowConcurrentWrite) { int fileShare = Win32FileNativeMethods.FILE_SHARE_READ; if (allowConcurrentWrite) { fileShare |= Win32FileNativeMethods.FILE_SHARE_WRITE; } if (this.CreateFileParameters.EnableFileDelete && PlatformDetector.GetCurrentRuntimeOS() != RuntimeOS.Windows) { fileShare |= Win32FileNativeMethods.FILE_SHARE_DELETE; } IntPtr handle = Win32FileNativeMethods.CreateFile( fileName, Win32FileNativeMethods.FileAccess.GenericWrite, fileShare, IntPtr.Zero, Win32FileNativeMethods.CreationDisposition.OpenAlways, this.CreateFileParameters.FileAttributes, IntPtr.Zero); if (handle.ToInt32() == -1) { Marshal.ThrowExceptionForHR(Marshal.GetHRForLastWin32Error()); } var safeHandle = new Microsoft.Win32.SafeHandles.SafeFileHandle(handle, true); var returnValue = new FileStream(safeHandle, FileAccess.Write, this.CreateFileParameters.BufferSize); returnValue.Seek(0, SeekOrigin.End); return(returnValue); }