///// <summary> ///// Формирует список файлов содержащихся в указанном каталоге ///// Файлы включаются в результирующий список если удовлетворяют условиям определённым в параметре options ///// </summary> ///// <param name="folder"> ///// каталог в котором искать файлы ///// </param> ///// <param name="filelist"> ///// Список найденных файлов ///// </param> ///// <param name="options"> ///// условия которым должен удовлетворять файл для включения в список файлов ///// </param> ///// <returns></returns> /// <summary> /// Формирует список файлов содержащихся в указанном каталоге /// Файлы включаются в результирующий список если удовлетворяют условиям определённым в параметре options /// </summary> /// <param name="folder"> /// каталог в котором искать файлы /// </param> /// <param name="filelist"> /// Список найденных файлов /// </param> /// <param name="options"> /// условия которым должен удовлетворять файл для включения в список файлов /// </param> /// <returns></returns> private async Task GetFolderFiles(Folder folder, CancellationToken canselationToken, OperationStatus status) { status.Id = SearchStatus.NewFileSelected; var progress = _progress as IProgress <OperationStatus>; try // Каталог может быть удалён после того как начался поиск дубликатов { var storageFolder = await StorageFolder.GetFolderFromPathAsync(folder.FullName); List <string> l = new List <string>(); l.AddRange(_fileSelectionOptions.FileTypeFilter.Where(f => f != "")); var queryOptions = new QueryOptions(CommonFileQuery.OrderByName, _fileSelectionOptions.FileTypeFilter.Where(f => f != "")); var query = storageFolder.CreateFileQueryWithOptions(queryOptions); foreach (StorageFile item in await query.GetFilesAsync()) { canselationToken.ThrowIfCancellationRequested(); if (_fileSelectionOptions.ExcludeExtentions.Contains(item.FileType)) { continue; } File file = new File(item.Name, item.Path, item.FileType, item.DateCreated.DateTime, new DateTime(), 0, folder.IsPrimary, folder.IsProtected); Windows.Storage.FileProperties.BasicProperties basicproperties = await item.GetBasicPropertiesAsync(); file.DateModifyed = basicproperties.DateModified.DateTime; file.Size = basicproperties.Size; _filesCollection.Add(file); ++status.HandledItems; progress.Report(status); } } catch (FileNotFoundException ex) { status.Id = SearchStatus.Error; status.Message = $"{ex.Message} ' {folder.FullName} '"; throw new OperationCanceledException(); } }
private void ReportStatus(OperationStatus status) { _status = status.Id; switch (status.Id) { case SearchStatus.NewFileSelected: SearchStatusInfo = string.Format("Selecting files. Total files selected {0}.", status.HandledItems); break; case SearchStatus.Grouping: SearchStatusInfo = string.Format("Groupping files by {0}. Handled {1} files from {2}.", status.Stage, status.HandledItems, status.TotalItems); break; case SearchStatus.GroupingCompleted: SearchStatusInfo = string.Format("Grouping complete. Regrouped {0} duplicates into {1} groups.", _duplicatesCollection.FilesCount, _duplicatesCollection.Count); break; case SearchStatus.ComparingStarted: case SearchStatus.Comparing: SearchStatusInfo = string.Format("Comparing files by {0}. Compared {1} files from {2}.", status.Stage, status.HandledItems, status.TotalItems); break; case SearchStatus.Sorting: SearchStatusInfo = $"Sorting files by {status.Stage}."; break; case SearchStatus.SearchCompleted: SearchStatusInfo = string.Format("Search completed. Found {0} duplicates in {1} groups.", _duplicatesCollection.FilesCount, _duplicatesCollection.Count); break; case SearchStatus.SearchCanceled: SearchStatusInfo = string.Format("Search canceled."); break; case SearchStatus.GroupingCanceled: SearchStatusInfo = string.Format("Grouping canceled."); break; case SearchStatus.ResultsCleared: SearchStatusInfo = string.Format("Search results cleared."); break; case SearchStatus.StartCancelOperation: SearchStatusInfo = string.Format("Canceling current operation."); break; case SearchStatus.Error: status.Message = status.Message.Replace('\r', ' '); status.Message = status.Message.Replace('\n', ' '); SearchStatusInfo = string.Format("Error: {0} Operation canceled.", status.Message); break; } SearchStatusChanged?.Invoke(this, status.Id); if (OperationCompleted) { _duplicatesCollection.Invalidate(); } }