从目录和子目录中获取文件,按照最新创建日期快速排序

时间:2014-08-22 13:55:28

标签: c# .net

我正在寻找一种方法,该方法将采用文件扩展名类型和目录,并返回此目录中的所有文件以及按最新创建日期排序的子目录,即最新文件。

到目前为止,我已经确定了以下方法,这意味着快速,但有更好的方法,我需要它返回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]);
    }
}
}

3 个答案:

答案 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);
    }