在根目录中获取文件数组的最有效方法(如果存在)
Most efficient way (if exists) to get array of files in root
我想(递归地)获取 linux OS 的根目录 /
中的所有文件。
我正在使用以下代码
var files = System.IO.Directory.GetFiles("/", "*", SearchOption.AllDirectories);
但是它花费了太多时间,这使得我的代码效率低下。有什么方法可以更有效地递归查找文件吗?
我想到了 this 答案,但它又比 System.IO.Directory.GetFiles()
花费了更多时间
我认为 Matthew Watson 是对的,因为有光盘,无论你做什么都会很慢。我唯一想做的就是并行进行。如果您在等待结果时有其他事情要做,也许 async 是一个不错的选择。
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);
});
}
}
}
我想(递归地)获取 linux OS 的根目录 /
中的所有文件。
我正在使用以下代码
var files = System.IO.Directory.GetFiles("/", "*", SearchOption.AllDirectories);
但是它花费了太多时间,这使得我的代码效率低下。有什么方法可以更有效地递归查找文件吗?
我想到了 this 答案,但它又比 System.IO.Directory.GetFiles()
我认为 Matthew Watson 是对的,因为有光盘,无论你做什么都会很慢。我唯一想做的就是并行进行。如果您在等待结果时有其他事情要做,也许 async 是一个不错的选择。
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);
});
}
}
}