Пример #1
0
        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);
        }
Пример #2
0
        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);
        }
Пример #3
0
        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);
        }