예제 #1
0
        private void ReadNative(Queue <FolderState> subdirs, CancellationToken token)
        {
            Win32FindData find        = new Win32FindData();
            FolderState   folderState = subdirs.Dequeue();
            ScanningState state       = folderState.State;
            FolderItem    parent      = folderState.Folder;
            bool          findResult;
            string        parentPath    = parent.FullName;
            string        searchPattern = PathUtils.CombineNoChecks(parentPath, "*");

            if (!searchPattern.StartsWith(@"\\?\"))
            {
                searchPattern = @"\\?\" + searchPattern;
            }
            IntPtr hFind = FindFirstFileEx(searchPattern,
                                           FindExInfoLevels.Basic, out find,
                                           FindExSearchOps.NameMatch, IntPtr.Zero,
                                           FindExFlags.LargeFetch);

            if (hFind == InvalidHandle)
            {
                return;
            }

            FolderItem fileCollection = null;
            FileItem   firstFile      = null;
            bool       subdirsAdded   = false;

            try {
                do
                {
                    string filePath = PathUtils.CombineNoChecks(parentPath, find.cFileName);
                    if (find.IsRelativeDirectory || SkipFile(state, find.cFileName, filePath))
                    {
                        // Skip these types of entries
                        findResult = FindNextFile(hFind, out find);
                        continue;
                    }
                    FileItemBase child;
                    if (find.IsDirectory)
                    {
                        FolderItem folder = new FolderItem(new WindowsScanFileInfo(find, filePath));
                        child = folder;
                        if (!find.IsSymbolicLink)
                        {
                            subdirsAdded = true;
                            subdirs.Enqueue(new FolderState(folder, state));
                        }
                    }
                    else
                    {
                        ExtensionItem extension = Extensions.GetOrAddFromPath(filePath);
                        FileItem      file      = new FileItem(new WindowsScanFileInfo(find, filePath), extension);
                        child = file;
                        if (!find.IsSymbolicLink)
                        {
                            TotalScannedSize += child.Size;
                        }
                    }
                    parent.AddItem(child, ref fileCollection, ref firstFile);

                    if (AsyncChecks(token))
                    {
                        return;
                    }

                    findResult = FindNextFile(hFind, out find);
                } while (findResult);

                if (!subdirsAdded)
                {
                    parent.Finish();
                }
                //if (parent.IsWatched)
                //	parent.RaiseChanged(FileItemAction.ChildrenDone);
            }
            finally {
                FindClose(hFind);
            }
        }