我想搜索文件夹和子文件夹中的所有文件,并查找具有特定详细信息的文件,该怎么做?
我使用以下方法,但是在这种方法中,我必须等到收到所有文件后,再通过循环检查它们的详细信息,但是当我有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]);
}
}
}
我想同时执行此操作。搜索时检查文件详细信息
答案 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
关键字添加到执行此调用的方法中。