public async Task <FileCheckReport> Execute(ImportFilesRequest request, CancellationToken cancellationToken = default) { State.Status = ImportFilesStatus.Scanning; var fileInfos = new FileInformation[request.Files.Count]; var counter = -1; // as we always increment and the first index is zero await TaskCombinators.ThrottledAsync(request.Files, async (filename, _) => { var index = Interlocked.Increment(ref counter); try { var file = request.Directory.GetFile(filename); if (file == null) { return; // not found } fileInfos[index] = await _fileInformationLoader.Load(file); } finally { State.Progress = (double)counter / request.Files.Count; } }, cancellationToken, 4); State.Status = ImportFilesStatus.Querying; _checkFilesWorker.State.PropertyChanged += (_, __) => State.Progress = _checkFilesWorker.State.Progress; return(await _checkFilesWorker.Execute(new CheckFilesRequest(fileInfos.Where(x => x != null).ToList(), request.Directory), cancellationToken)); }
public async Task <FileCheckReport> Execute(CheckIndexRequest request, CancellationToken cancellationToken = default) { // get all files from the repository IReadOnlyList <IndexedFile> indexedFiles; await using (var context = request.Directory.GetDataContext()) { indexedFiles = await context.FileRepository.GetAllReadOnlyBySpecs(new IncludeFileLocationsSpec()); } var fileInfos = indexedFiles.SelectMany(x => x.Files.Select(y => x.ToFileInformation(y.RelativeFilename, request.Directory))).ToList(); var response = await _checkFilesWorker.Execute(new CheckFilesRequest(fileInfos, request.Directory), cancellationToken); var ignoredIssues = request.Directory.MemoryManager.DirectoryMemory.IgnoredIssues; var issues = response.Issues.Where(x => !ignoredIssues.Contains(x.Identity)).ToList(); return(new FileCheckReport(issues)); }