如何递归搜索目录?

时间:2015-02-25 19:47:40

标签: c# recursion

我需要以相同的方式更改大量文件名。它们共享一个共同的根,但在其他文件夹中分散到该根。我正在尝试在c#中编写一个程序,该程序从根目录开始,递归遍历所有子代,并更改文件名或进入下一个文件夹。这就是我所拥有的:

public void cascade(string path)
    {
        if(IsDirectoryEmpty(path) == true) 
        { }
        else
        {
            String[] childFolders = Directory.GetDirectories(path);
            String[] childFiles = Directory.GetFiles(path);
            ChangeFileName();

            for (int p = 0; p < childFolders.Length; p++)
            {
                cascade(childFolders[p]);
            }
        }
    }

按钮调用级联并传入初始根目录。然后我找到了他们写的方法来检查它是否为空:

public bool IsDirectoryEmpty(string path)
    {
        return !Directory.EnumerateFileSystemEntries(path).Any();
    }

我每次进入一个新目录时都试图更改fileNames,如果有更多文件夹我输入它们来更改更多文件名。它不工作,我不知道为什么。更改文件名有效,但此方法无法到达所有文件夹。

5 个答案:

答案 0 :(得分:0)

存在功能,它将实现Enum SearchOption.AllDirectories。这将触发递归功能:

var directories = Directory.GetFiles(path, "*.*", SearchOption.AllDirectories);

您也可以对DirectoryInfo执行相同的操作,稍作修改。

  

searchOption类型:

     

System.IO.SearchOption其中一个枚举   指定搜索操作是否应仅包含的值   当前目录或所有子目录。

有关此内容的更多信息,请访问here

重要提示,一旦您获得了这些目录的列表,您就可以循环并以您想要的任何方式进行修改。如果您只是重命名文件,则还需要实施File.Move

答案 1 :(得分:0)

使用以下方法。将函数中的根目录作为参数传递。

void DirSearch(string sDir) 
{
try 
{
   foreach (string d in Directory.GetDirectories(sDir)) 
   {
    foreach (string f in Directory.GetFiles(d, txtFile.Text)) 
    {
       ChangeFileName();
    }
    DirSearch(d);
   }
}
catch (System.Exception excpt) 
{
    Console.WriteLine(excpt.Message);
}
}

答案 2 :(得分:0)

递归函数很难调试。您可以尝试这样的非递归版本:

    public void ChangeAllFiles(String root)
    {
        Stack<String> searchStack = new Stack<string>();
        searchStack.Push(root);

        while (searchStack.Count > 0)
        {
            String path = searchStack.Pop();
            foreach (var file in Directory.GetFiles(path))
            {
                ChangeFileName(file);
            }

            foreach (var subDir in Directory.GetDirectories(path))
            {
                searchStack.Push(subDir);
            }
        }
    }

如果这不起作用:缺少哪些文件夹?

答案 3 :(得分:0)

这个应该可以解决问题。

public void cascade(string path)
{
    String[] childFiles = Directory.GetFiles(path);
    if(childFiles.lenght > 0)
    {
        String[] childFolders = Directory.GetDirectories(path); 
        ChangeFileName(childFiles); //iterate and change each fileName

        for (int p = 0; p < childFolders.Length; p++)
        {
            cascade(childFolders[p]);
        }
    }
}

答案 4 :(得分:0)

我需要更改changeFiles方法以接受路径作为参数。然后在级联方法中,我传递了更改文件方法传递给级联方法的路径。

public void cascade(string path)
    {
        if(IsDirectoryEmpty(path) == true) 
        { }
        else
        {
            String[] childFolders = Directory.GetDirectories(path);
            String[] childFiles = Directory.GetFiles(path);
            ChangeFileName(path);

            for (int p = 0; p < childFolders.Length; p++)
            {
                cascade(childFolders[p]);
            }
        }
    }