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