Example #1
0
        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);
        }
Example #2
0
        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);
            }
        }