Поиск в файлах с подробной проверкой - PullRequest
0 голосов
/ 10 февраля 2019

Я хочу найти все файлы в папке и подпапках и найти файлы с конкретными сведениями. Как я могу это сделать?
Я использую следующий метод, но в этом методе мне приходится ждать, пока все файлыПолучите, затем проверьте их данные с помощью цикла. Но это занимает много времени, когда у меня более 1000 файлов

AllofItems = GetFileList(@"\myfolder").ToArray();
foreach (var item in AllofItems)
{
    var file = ShellFile.FromFilePath(item); // for example C:\myfolder\1.jpg
    if(file.Properties.System.Title.Value.Equal("Empty")){
        coverView.Items.Add(item);
    }
}

, а это GetFileList func

public IEnumerable<string> GetFileList(string rootFolderPath)
{
    Queue<string> pending = new Queue<string>();
    pending.Enqueue(rootFolderPath);
    string[] tmp;
    while (pending.Count > 0)
    {
        rootFolderPath = pending.Dequeue();
        try
        {
            tmp = Directory.GetFiles(rootFolderPath);
        }
        catch (DirectoryNotFoundException) { continue; }
        catch (UnauthorizedAccessException)
        {
            continue;
        }
        for (int i = 0; i < tmp.Length; i++)
        {
            yield return tmp[i];
        }
        tmp = Directory.GetDirectories(rootFolderPath);
        for (int i = 0; i < tmp.Length; i++)
        {
            pending.Enqueue(tmp[i]);
        }
    }
}

Iхочу сделать это одновременно.Проверьте детали файла при поиске

1 Ответ

0 голосов
/ 10 февраля 2019

Класс DirectoryInfo имеет полезные методы для этого.

var dir = new DirectoryInfo(@"C:\myBaseFolder");
FileInfo[] allfiles = dir.GetFiles("*.*", SearchOption.AllDirectories);

Это будет автоматически включать все подкаталоги.

Вы можете воспользоваться таким ключевым словом await, как это

private static async Task<FileInfo[]>  GetFileList(string rootFolderPath)
{
    FileInfo[] allfiles;
    await Task.Run(() => {
        var dir = new DirectoryInfo(rootFolderPath);
        allfiles = dir.GetFiles("*.*", SearchOption.AllDirectories);
    });
    return allfiles;
}

, и назвать его так:

FileInfo[] allFiles = await GetFileList(@"\myfolder");

и не забудьте добавить async ключевое слово для метода, выполняющего этот вызов.

...