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);
        }
Exemple #5
0
        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);
            }
        }