我想(递归地)在/
Linux OS的根目录中获取所有文件。我正在使用以下代码
var files = System.IO.Directory.GetFiles("/", "*", SearchOption.AllDirectories);
但是它花费了太多时间,这使我的代码效率低下。有什么方法可以以更有效的方式递归查找文件?
我想到了这个答案,但再次花费的时间比System.IO.Directory.GetFiles()
我认为Matthew Watson是对的,由于光盘的影响,您所做的一切都会缓慢运行。我唯一想做的就是并行执行。如果在等待结果的同时还有其他事情要做,那么异步可能是个不错的选择。
using System;
using System.Threading.Tasks;
using System.IO;
using System.Collections.Concurrent;
namespace Test
{
class Program
{
static void Main(string[] args)
{
GetFilesOnRoot("*");
Console.ReadLine();
}
private static ConcurrentBag<string> FilesBag;
private static void GetFilesOnRoot(string filter)
{
FilesBag = new ConcurrentBag<string>();
DirectoryInfo dirRoot = new DirectoryInfo("/");
GetDirTree(dirRoot, "*");
}
private static void GetDirTree(DirectoryInfo dr, string filter)
{
FileInfo[] files = null;
DirectoryInfo[] subDirs = null;
try
{
files = dr.GetFiles(filter + ".*");
}
catch(Exception) { }
if (files != null)
{
Parallel.ForEach(files, (FileInfo item) => { FilesBag.Add(item.Name); });
subDirs = dr.GetDirectories();
Parallel.ForEach(subDirs, (DirectoryInfo item) => { GetDirTree(item,filter); });
}
}
public static async Task GetFilesOnRootAsync(string filter)
{
await Task.Run(() => {
GetFilesOnRoot(filter);
});
}
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句