Для переименования имени папки я использовал приведенный ниже код. Когда я отлаживаю это для каждого, возвращают правильное значение, и он распознает папки с шаблоном, но он не может переименовать имя папки!

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);
}
c#
-1
D.JCode 20 Авг 2018 в 21:02

4 ответа

Лучший ответ

В этом случае вы, похоже, меняете строку и нигде не переименовываете папку. Вам нужно будет пройти и переименовать указанную папку следующим образом:

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

Это должно переименовать каждую папку, поскольку это идентифицирует это.

1
Fabulous 20 Авг 2018 в 18:15

Я думаю, что есть две вещи для рассмотрения:

  1. Переменная итерации не может быть изменена.
  2. Метод Regex.Replace принимает три параметра и возвращает:

Новая строка, идентичная входной строке, за исключением того, что строка замены занимает место каждой соответствующей строки. Если шаблон не соответствует текущему экземпляру, метод возвращает текущий экземпляр без изменений.

Вы можете взглянуть на него здесь.

Исходя из этого, следующий код находит совпадающие имена папок и переименовывает их.

      string findFolderNamePattern = @"((?i)domain|.com(?-i))";
      string replacement = "";    
      foreach (var myDirectory in myDirectories)
      {
          string newDirName = Regex.Replace(myDirectory, findFolderNamePattern, replacement);
          Directory.Move(myDirectory, newDirName);
      }
1
heuristican 20 Авг 2018 в 18:49

Поскольку вы не можете изменять итераторы цикла, вы можете использовать другой массив, как показано в коде ниже:

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++;
        }
    }
0
PiJei 20 Авг 2018 в 18:11

Используйте цикл 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++;

}

Или просто сделайте это (как прокомментировал Дэн Уилсон):

replacement = Regex.Replace(myDirectories[x], findFolderNamePattern);
0
T McKeown 20 Авг 2018 в 18:22
51936229