我正在寻找一种方法,该方法将采用文件扩展名类型和目录,并返回此目录中的所有文件以及按最新创建日期排序的子目录,即最新文件。
到目前为止,我已经确定了以下方法,这意味着快速,但有更好的方法,我需要它返回FileInfo而不是字符串,并按上述顺序排序。
public static IEnumerable<string> GetFileList(string fileSearchPattern, string rootFolderPath)
{
Queue<string> pending = new Queue<string>();
pending.Enqueue(rootFolderPath);
string[] tmp;
while (pending.Count > 0)
{
rootFolderPath = pending.Dequeue();
tmp = Directory.GetFiles(rootFolderPath, fileSearchPattern);
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)
当我研究这个问题空间时,我发现没有fast
方法可以做到这一点。原因是无论采用何种方法,最终都必须转到操作系统以获取目录中的文件列表。并且文件系统不会以搜索引擎的方式缓存/索引。所以你最终需要自己重新抓取文件系统。
但是,获得原始信息后,您可以自行编制索引。
答案 1 :(得分:1)
以下内容适用于您的目的。您希望使用Directory.EnumerateFiles(...)来允许文件列表预先使用较少的内存。它只会在你要求它时寻找下一个元素,而不是在开始时将整个集合加载到内存中。
Directory.EnumerateFiles(rootFolderPath, fileSearchPattern, System.IO.SearchOption.AllDirectories).OrderBy(file => new FileInfo(file).CreationTime)
另外一个考虑因素。由于您在文件系统中进行相当盲目的搜索,如果您尝试枚举文件并抛出异常,它将使枚举器无效,导致它退出而不完成。我已经发布了该问题的解决方案here
答案 2 :(得分:0)
Directory.GetFiles有一个递归搜索的选项。
以下情况应该有效,尽管我没有尝试过。
IEnumerable<FileInfo> GetFileList(string directory, string extension)
{
return Directory.GetFiles(directory, "*" + extension, SearchOption.AllDirectories)
.Select(f => new FileInfo(f))
.OrderByDescending(f => f.CreationTime);
}