示例#1
0
        public void IndexDirectory(string path, HashSet <string> ignoredDirectories, ExtensionContainer extensionContainer)
        {
            if (string.IsNullOrWhiteSpace(path))
            {
                return;
            }

            try
            {
                var traverseDirectoriesWatch = Stopwatch.StartNew();

                var allFiles = SafeWalk.EnumerateFiles(path, ignoredDirectories);

                var paths = allFiles
                            .Where(x => extensionContainer.IsKnownExtension(Path.GetExtension(x)))
                            .Distinct()
                            .ToArray();

                traverseDirectoriesWatch.Stop();

                var indexWatch = Stopwatch.StartNew();

                try
                {
                    _lock.EnterWriteLock();
                    _indexData.Update(path, paths);
                    SaveIndex();
                }
                finally
                {
                    _lock.ExitWriteLock();
                }

                indexWatch.Stop();

                var traverseMs = traverseDirectoriesWatch.ElapsedMilliseconds;
                var indexMs    = indexWatch.ElapsedMilliseconds;
                var totalMs    = indexWatch.ElapsedMilliseconds + traverseDirectoriesWatch.ElapsedMilliseconds;

                Log.Information($"Index {path} - {paths.Length} items. [ {totalMs} ms, tra: {traverseMs} ms, idx: {indexMs} ms ]");
            }
            catch (Exception e)
            {
                Log.Error(e, "Failed to index path: {path}, message: {message}", path, e.Message);
            }
        }
示例#2
0
        private static FileItem[] BuildFileItems(string[] paths)
        {
            var stopwatch = Stopwatch.StartNew();

            var allFiles = paths.SelectMany(x => FileIndexStore.Instance.GetIndexedPaths(x));

            var fileItems = allFiles
                            .Where(x => _extensionContainer.IsKnownExtension(Path.GetExtension(x)))
                            .Distinct()
                            .Select(BuildFileItem)
                            .Where(x => x != null)
                            .ToArray();

            stopwatch.Stop();

            Log.Information("Built {count} FileItems for index in {time} ms", fileItems.Length, stopwatch.ElapsedMilliseconds);
            return(fileItems);
        }
示例#3
0
        public ImmutableList <FileItem> GetFiles(DirectoryInfo directory)
        {
            var directoryQueue = new Queue <DirectoryInfo>();

            directoryQueue.Enqueue(directory);

            var fileItems = new List <FileItem>();

            while (directoryQueue.Any())
            {
                DirectoryInfo nextDirectory = directoryQueue.Dequeue();

                try
                {
                    FileSystemInfo[] fileSystemInfos = nextDirectory.GetFileSystemInfos();

                    foreach (var fileSystemInfo in fileSystemInfos)
                    {
                        if ((fileSystemInfo.Attributes & FileAttributes.Directory) == FileAttributes.Directory)
                        {
                            directoryQueue.Enqueue(new DirectoryInfo(fileSystemInfo.FullName));
                        }
                        else
                        {
                            if (_extensionContainer.IsKnownExtension(fileSystemInfo.Extension))
                            {
                                fileItems.Add(new FileItem(fileSystemInfo.FullName));
                            }
                        }
                    }
                }
                catch (UnauthorizedAccessException)
                {
                }
                catch (PathTooLongException)
                {
                }
            }

            return(fileItems.ToImmutableList());
        }