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

Posted

技术标签:

【中文标题】如何执行完整的递归目录和文件扫描?【英文标题】:How can I perform full recursive directory & file scan? 【发布时间】:2011-09-30 02:22:01 【问题描述】:

这是我的代码:

    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 中获取文件?

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

【参考方案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】:
private static void TreeScan( string sDir )

    foreach (string f in Directory.GetFiles( sDir ))
    
        //Save f :)
    
    foreach (string d in Directory.GetDirectories( sDir ))
    
        TreeScan( d ); 
    

【讨论】:

【参考方案4】:

您的 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】:

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

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

【讨论】:

终于有人懂了。 是的,但递归在第一次使用文件夹 System.UnauthorizedAccessException 保护时失败。 如果您不需要搜索模式,您可以使用星号 (*) 作为搜索模式返回所有目录【参考方案6】:

你必须使用

Directory.GetFiles(targetDirectory);

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

【讨论】:

以上是关于如何执行完整的递归目录和文件扫描?的主要内容,如果未能解决你的问题,请参考以下文章

使用 C++ 递归扫描目录上的 ACL

递归文件搜索的问题

基于递归 Promise 的目录读取

Redshift 复制命令递归扫描

使用 Cordova 递归读取所有文件和文件夹结构

php递归删除文件夹