private static uint GetSectorSize(string filename) { if (sectorSize > 0) { return(sectorSize); } /* Get true physical sector size if we want to use it - commented for now as we prefer to use logical sector size (smaller) */ /* * SafeFileHandle safeFileHandle = CreateHandle(0, true, true, false, 0, filename + ".tmp"); * if (!safeFileHandle.IsInvalid) * { * if (Native32.GetFileInformationByHandleEx(safeFileHandle, Native32.FILE_INFO_BY_HANDLE_CLASS.FileStorageInfo, out Native32.FILE_STORAGE_INFO info, (uint)sizeof(Native32.FILE_STORAGE_INFO))) * { * sectorSize = info.PhysicalBytesPerSectorForAtomicity; * } * safeFileHandle.Dispose(); * } * if (sectorSize > 0) return sectorSize; * Debug.WriteLine($"Unable to retrieve sector size information for temporary handle {filename + ".tmp"}, trying disk level information"); */ if (!Native32.GetDiskFreeSpace(filename.Substring(0, 3), out _, out sectorSize, out _, out _)) { Debug.WriteLine("Unable to retrieve information for disk " + filename.Substring(0, 3) + " - check if the disk is available and you have specified the full path with drive name. Assuming sector size of 512 bytes."); sectorSize = 512; } return(sectorSize); }
public SegmentedLocalStorageDevice(string dirname, long segmentSize = -1, bool enablePrivileges = false, bool useIoCompletionPort = false, bool unbuffered = false, bool deleteOnClose = false) { this.dirname = dirname; this.segmentSize = segmentSize; this.enablePrivileges = enablePrivileges; this.useIoCompletionPort = useIoCompletionPort; this.unbuffered = unbuffered; this.deleteOnClose = deleteOnClose; if (enablePrivileges) { Native32.EnableProcessPrivileges(); } if (!Native32.GetDiskFreeSpace(dirname.Substring(0, 3), out uint lpSectorsPerCluster, out lpBytesPerSector, out uint lpNumberOfFreeClusters, out uint lpTotalNumberOfClusters)) { throw new Exception("Unable to retrieve information for disk " + dirname.Substring(0, 3) + " - check if the disk is available."); } logHandles = new ConcurrentDictionary <int, SafeFileHandle>(); }
private static uint GetSectorSize(string filename) { if (!Native32.GetDiskFreeSpace(filename.Substring(0, 3), out uint lpSectorsPerCluster, out uint _sectorSize, out uint lpNumberOfFreeClusters, out uint lpTotalNumberOfClusters)) { Debug.WriteLine("Unable to retrieve information for disk " + filename.Substring(0, 3) + " - check if the disk is available and you have specified the full path with drive name. Assuming sector size of 512 bytes."); _sectorSize = 512; } return(_sectorSize); }
private static uint GetSectorSize(string filename) { #if DOTNETCORE if (!RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) { Debug.WriteLine("Assuming 512 byte sector alignment for disk with file " + filename); return(512); } #endif if (!Native32.GetDiskFreeSpace(filename.Substring(0, 3), out uint lpSectorsPerCluster, out uint _sectorSize, out uint lpNumberOfFreeClusters, out uint lpTotalNumberOfClusters)) { Debug.WriteLine("Unable to retrieve information for disk " + filename.Substring(0, 3) + " - check if the disk is available and you have specified the full path with drive name. Assuming sector size of 512 bytes."); _sectorSize = 512; } return(_sectorSize); }
public LocalStorageDevice(string filename, bool enablePrivileges = false, bool useIoCompletionPort = false, bool unbuffered = false, bool deleteOnClose = false) { this.filename = filename; this.enablePrivileges = enablePrivileges; this.useIoCompletionPort = useIoCompletionPort; if (enablePrivileges) { Native32.EnableProcessPrivileges(); } Native32.GetDiskFreeSpace(filename.Substring(0, 3), out lpSectorsPerCluster, out lpBytesPerSector, out lpNumberOfFreeClusters, out lpTotalNumberOfClusters); uint fileAccess = Native32.GENERIC_READ | Native32.GENERIC_WRITE; uint fileShare = unchecked (((uint)FileShare.ReadWrite & ~(uint)FileShare.Inheritable)); uint fileCreation = unchecked ((uint)FileMode.OpenOrCreate); uint fileFlags = Native32.FILE_FLAG_OVERLAPPED; if (unbuffered) { fileFlags = fileFlags | Native32.FILE_FLAG_NO_BUFFERING; } if (deleteOnClose) { fileFlags = fileFlags | Native32.FILE_FLAG_DELETE_ON_CLOSE; } logHandle = Native32.CreateFileW(filename, fileAccess, fileShare, IntPtr.Zero, fileCreation, fileFlags, IntPtr.Zero); if (enablePrivileges) { Native32.EnableVolumePrivileges(ref filename, logHandle); } if (useIoCompletionPort) { ioCompletionPort = Native32.CreateIoCompletionPort( logHandle, IntPtr.Zero, (uint)logHandle.DangerousGetHandle().ToInt64(), 0); } try { ThreadPool.BindHandle(logHandle); } catch (Exception e) { Console.WriteLine("Log handle! : {0}", logHandle.ToString()); Console.WriteLine(e.ToString()); Environment.Exit(0); } }