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); } }