我需要以相同的方式更改大量文件名。它们共享一个共同的根,但在其他文件夹中分散到该根。我正在尝试在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,如果有更多文件夹我输入它们来更改更多文件名。它不工作,我不知道为什么。更改文件名有效,但此方法无法到达所有文件夹。
答案 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]);
}
}
}