private HResult StartDirectoryEnumeration(int commandId, Guid enumerationId, string relativePath) { Console.WriteLine($"StartDirectoryEnumeration: `{relativePath}`, {enumerationId}"); // On Windows, we have to sort the child items. The PrjFlt driver takes our list and merges it with // what is on disk, and it assumes that both lists are already sorted. ActiveEnumeration activeEnumeration = new ActiveEnumeration( this.GetChildItems(relativePath) .OrderBy(file => file.Name, StringComparer.OrdinalIgnoreCase) .ToList()); if (!this.activeEnumerations.TryAdd(enumerationId, activeEnumeration)) { return(HResult.InternalError); } return(HResult.Ok); }
private HResult GetDirectoryEnumeration( Guid enumerationId, string filterFileName, bool restartScan, DirectoryEnumerationResults results) { Console.WriteLine($"GetDiretoryEnumeration: {enumerationId}, {filterFileName}"); try { ActiveEnumeration activeEnumeration = null; if (!this.activeEnumerations.TryGetValue(enumerationId, out activeEnumeration)) { return(HResult.InternalError); } if (restartScan) { activeEnumeration.RestartEnumeration(filterFileName); } else { activeEnumeration.TrySaveFilterString(filterFileName); } bool entryAdded = false; HResult result = HResult.Ok; while (activeEnumeration.IsCurrentValid) { ProjectedFileInfo fileInfo = activeEnumeration.Current; DateTime now = DateTime.UtcNow; result = results.Add( fileName: fileInfo.Name, fileSize: (ulong)(fileInfo.IsDirectory ? 0 : fileInfo.Size), isDirectory: fileInfo.IsDirectory, fileAttributes: fileInfo.IsDirectory ? (uint)FileAttributes.Directory : (uint)FileAttributes.Archive, creationTime: now, lastAccessTime: now, lastWriteTime: now, changeTime: now); if (result == HResult.Ok) { entryAdded = true; activeEnumeration.MoveNext(); } else { if (result == HResult.InsufficientBuffer) { if (entryAdded) { result = HResult.Ok; } } break; } } return(result); } catch (Win32Exception e) { return(HResultFromWin32(e.NativeErrorCode)); } catch (Exception) { return(HResult.InternalError); } }