搜索带有详细检查的文件

时间:2019-02-10 18:39:49

标签: c# wpf directory ienumerable

我想搜索文件夹和子文件夹中的所有文件,并查找具有特定详细信息的文件,该怎么做?
我使用以下方法,但是在这种方法中,我必须等到收到所有文件后,再通过循环检查它们的详细信息,但是当我有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函数

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

我想同时执行此操作。搜索时检查文件详细信息

1 个答案:

答案 0 :(得分:1)

DirectoryInfo Class为此提供了有用的方法。

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关键字添加到执行此调用的方法中。