为什么不能在foreach中更改文件夹名称

时间:2018-08-20 18:02:19

标签: c#

为重命名文件夹的名称,我使用了以下代码。 当我调试它时,每个函数都会返回一个正确的值,并且它会识别带有模式的文件夹 但是它不能重命名文件夹名称!

string[] myDirectories = Directory.GetDirectories(myRootPath, "*", 
    SearchOption.AllDirectories);

string findFolderNamePattern = @"((?i)domain|.com(?-i))";
string replacement = "";

foreach (var myDirectory in myDirectories)
{
    Regex.Replace(myDirectory, findFolderNamePattern, replacement);
}

4 个答案:

答案 0 :(得分:1)

在这种情况下,您似乎正在更改字符串,而不是在任何地方重命名文件夹。您需要仔细检查并重命名已标识的文件夹,如下所示:

foreach(var myDirectory in myDirectories)
{
    new DirectoryInfo(myDirectory).MoveTo(Regex.Replace(myDirectory, findFolderNamePattern, replacement));
}

这应该重命名每个文件夹。

答案 1 :(得分:1)

我认为有两件事要考虑:

  1. 迭代变量无法更改。
  2. Regex.Replace方法采用三个参数并返回:
  

与输入字符串相同的新字符串,   除了替换字符串代替每个匹配字符串   串。如果当前实例中的模式不匹配,则该方法   返回当前实例不变。

您可以看看here

基于这些代码,以下代码查找匹配的文件夹名称并将其重命名。

      string findFolderNamePattern = @"((?i)domain|.com(?-i))";
      string replacement = "";    
      foreach (var myDirectory in myDirectories)
      {
          string newDirName = Regex.Replace(myDirectory, findFolderNamePattern, replacement);
          Directory.Move(myDirectory, newDirName);
      }

答案 2 :(得分:0)

如果要更新数组,请使用for循环并在其中定义变量。

for (int x=0; x < myDirectories.Count; x++)
{
    replacement = Regex.Replace(myDirectories[x], findFolderNamePattern);
    myDirectories[x] = replacement;  //this requires a for loop
}

或者忘记临时变量:

for (int x=0; x < myDirectories.Count; x++)
{
    myDirectories[x] = Regex.Replace(myDirectories[x], findFolderNamePattern);
}

如果您不想使用for循环:

int x = 0;
foreach (var myDirectory in myDirectories.ToList())
{
   replacement = Regex.Replace(myDirectory, findFolderNamePattern);
   myDirectories[x] = replacement;  //this requires a for loop
   x++;

}

或者,只需执行此操作(如Dan Wilson所评论):

replacement = Regex.Replace(myDirectories[x], findFolderNamePattern);

答案 3 :(得分:0)

由于您不能更改循环迭代器,因此可以使用另一个数组,如下面的代码所示:

public static void Rename(string myRootPath)
    {
        string[] myDirectories = Directory.GetDirectories(myRootPath, "*", SearchOption.AllDirectories);
        string[] myDirectoriesModified = new string[myDirectories.Length];

        string findFolderNamePattern = @"((?i)domain|.com(?-i))";
        string replacement = "";

        int i = 0;
        foreach (var myDirectory in myDirectories)
        {
            myDirectoriesModified[i] = Regex.Replace(myDirectory, findFolderNamePattern, replacement);
            i++;
        }
    }