Для переименования имени папки я использовал приведенный ниже код. Когда я отлаживаю это для каждого, возвращают правильное значение, и он распознает папки с шаблоном, но он не может переименовать имя папки!
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 ответа
В этом случае вы, похоже, меняете строку и нигде не переименовываете папку. Вам нужно будет пройти и переименовать указанную папку следующим образом:
foreach(var myDirectory in myDirectories)
{
new DirectoryInfo(myDirectory).MoveTo(Regex.Replace(myDirectory, findFolderNamePattern, replacement));
}
Это должно переименовать каждую папку, поскольку это идентифицирует это.
Я думаю, что есть две вещи для рассмотрения:
- Переменная итерации не может быть изменена.
- Метод 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);
}
Поскольку вы не можете изменять итераторы цикла, вы можете использовать другой массив, как показано в коде ниже:
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++;
}
}
Используйте цикл 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);
Новые вопросы
c#
C # (произносится как «резкий») - это высокоуровневый, статически типизированный язык программирования с несколькими парадигмами, разработанный Microsoft. Код C # обычно нацелен на семейство инструментов и сред выполнения Microsoft .NET, включая, среди прочего, .NET Framework, .NET Core и Xamarin. Используйте этот тег для вопросов о коде, написанном на C # или в формальной спецификации C #.