bool BuildDBCallback(ref FileInfo Info, ref SafeFileHandle FileHandle, ref BuildDBInfo DBInfo) { DriveVolume Vol = DBInfo.Volume; Vol.Files.Add(Info); if (DBInfo.QuitMonitor) { return(false); } DBInfo.ClusterProgress += Info.Clusters; DBInfo.Percent = (DBInfo.ClusterProgress / (double)DBInfo.ClusterCount) * 100.0f; return(true); }
public bool BuildFileList(Defragment defrag) { Files.Clear(); Directories.Clear(); Directories.Add(RootPath); BuildDBInfo Info = new BuildDBInfo(defrag, this, (PartInfo.TotalBytes - PartInfo.FreeBytes) / PartInfo.ClusterSize); ScanDirectory(RootPath, BuildDBCallback, Info); if (defrag.PleaseStop) { Directories.Clear(); Files.Clear(); } return(true); }
public bool ScanDirectory(string DirPrefix, ScanCallback Callback, BuildDBInfo UserData) { PInvoke.WIN32_FIND_DATA FindData; var DirIndice = (uint)Directories.Count - 1; var SearchString = DirPrefix + "*"; var FindHandle = PInvoke.FindFirstFile(SearchString, out FindData); if (FindHandle == PInvoke.INVALID_HANDLE_VALUE) { return(false); } do { UInt64 FileSize = ((FindData.nFileSizeHigh << 32) | FindData.nFileSizeLow); FileInfo Info = new FileInfo(FindData.cFileName, DirIndice, FileSize, FindData.dwFileAttributes); SafeFileHandle Handle = null; // DonLL't ever include '.L' and '..' if (Info.Name == "." || Info.Name == "..") { continue; } //Info.FullName = DirPrefix + Info.Name; Info.Clusters = 0; if (GetClusterInfo(Info, ref Handle)) { UInt64 TotalClusters = Info.Fragments.Aggregate <Extent, ulong>(0, (current, ext) => current + ext.Length); Info.Clusters = TotalClusters; } else { Info.Attributes.Unmovable = true; Info.Attributes.Process = false; } if (Info.Attributes.Process) { Info.Attributes.Process = ShouldProcess(Info.Attributes); } // Run the user-defined callback function var CallbackResult = Callback(ref Info, ref Handle, ref UserData); if (!Handle.IsInvalid && !Handle.IsClosed) { Handle.Close(); } if (!CallbackResult) { break; } // If directory, perform recursion if (Info.Attributes.Directory) { var Dir = GetDBDir(Info.DirIndice); Dir += Info.Name; Dir += "\\"; Directories.Add(Dir); ScanDirectory(Dir, Callback, UserData); } } while (PInvoke.FindNextFile(FindHandle, out FindData)); PInvoke.FindClose(FindHandle); return(false); }