如何执行完整的递归目录&文件扫描?

时间:2011-07-07 01:29:40

标签: c# .net search recursion filesystems

这是我的代码:

    private static void TreeScan(string sDir)
    {
        foreach (string d in Directory.GetDirectories(sDir))
        {
            foreach (string f in Directory.GetFiles(d))
            {
                //Save file f
            }
        }
        TreeScan(d, client);
    }

问题是它没有获得 sDir (起始目录)的 FILES 它只获取文件夹和文件在子文件夹中。

如何让它从sDir获取文件?

6 个答案:

答案 0 :(得分:45)

不要重新发明轮子,使用允许您指定它搜索子目录的GetFiles重载。

string[] files 
    = Directory.GetFiles(path, searchPattern, SearchOption.AllDirectories);

答案 1 :(得分:9)

private static void TreeScan( string sDir )
{
    foreach (string f in Directory.GetFiles( sDir ))
    {
        //Save f :)
    }
    foreach (string d in Directory.GetDirectories( sDir ))
    {
        TreeScan( d ); 
    }
}

答案 2 :(得分:2)

您的代码存在一些问题。首先,您从未在根文件夹中看到文件的原因是因为您在执行和文件读取之前已经递归。试试这个:

public static void Main()
{
    TreeScan(@"C:\someFolder");
}

private static void TreeScan(string sDir)
{
    foreach (string f in Directory.GetFiles(sDir))
        Console.WriteLine("File: " + f); // or some other file processing

    foreach (string d in Directory.GetDirectories(sDir))
        TreeScan(d); // recursive call to get files of directory
}

答案 3 :(得分:1)

你必须使用

Directory.GetFiles(targetDirectory);

就像This sample一样,它包含了你正在寻找的完整实现

答案 4 :(得分:0)

您的GetFiles循环应该在GetDirectories循环之外。你的TreeScan不应该留在GetDirectories循环中吗?简而言之,代码应如下所示:

private static void TreeScan(string sDir)
{
    foreach (string d in Directory.GetDirectories(sDir))
    {
        TreeScan(d, client);
    }
    foreach (string f in Directory.GetFiles(d))
    {
        //Save file f
    }
}

答案 5 :(得分:0)

如果使用Fx4及更高版本,EnumerateFiles方法将返回所有具有高效内存管理的文件,而GetFiles可能需要大目录(或驱动器)上的最大资源。

var files = Directory.EnumerateFiles(dir.Path, "*.*");