2010-06-10 2 views
1

Я пытаюсь переименовать файлы, которые моя программа имеет как «незаконные символы» для импорта файлов SharePoint. Незаконными символами, которые я имею в виду, являются: ~ #% & * {}/\ | : <>? - ""Изменение имен файлов с использованием RegEx и Recursion

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

У кого-нибудь есть идеи, как это сделать? До сих пор у меня есть это: (пожалуйста, помните, что я полный n00b этого материал)

class Program 
{ 
    static void Main(string[] args) 
    { 
     string[] files = Directory.GetFiles(@"C:\Documents and Settings\bob.smith\Desktop\~Test Folder for [SharePoint] %testing", "*.*", SearchOption.AllDirectories); 
     foreach (string file in files) 
     { 
      Console.Write(file + "\r\n"); 


     } 
     Console.WriteLine("Press any key to continue..."); 
     Console.ReadKey(true); 



     string pattern = " *[\\~#%&*{}/:<>?|\"-]+ *"; 
     string replacement = " "; 
     Regex regEx = new Regex(pattern); 

     string[] fileDrive = Directory.GetFiles(@"C:\Documents and Settings\bob.smith\Desktop\~Test Folder for [SharePoint] %testing", "*.*", SearchOption.AllDirectories); 
     StreamWriter sw = new StreamWriter(@"C:\Documents and Settings\bob.smith\Desktop\~Test Folder for [SharePoint] %testing\File_Renames.txt"); 
     foreach(string fileNames in fileDrive) 
     { 

     string sanitized = regEx.Replace(fileNames, replacement); 
     sw.Write(sanitized + "\r\n"); 
     } 
     sw.Close(); 



    } 






} 

Так что мне нужно, чтобы выяснить, как рекурсивный поиск этих недопустимых символов, замените их в самом файл сам. У кого-нибудь есть идеи?

+0

Я думаю, что он просто означает, что их вырезать – slf

+0

делает регулярное выражение так, как вы хотите? – slf

ответ

1

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

GetDirectories возвращает больше экземпляров DirectoryInfo, поэтому вы можете ходить по дереву, а GetFiles возвращает FileInfo объектов.

Этот парень created a custom iterator рекурсивно выводит информацию о файле, которая, когда вы совмещаете ее с существующей работой с регулярным выражением, завершит ваше решение.

+0

Я взглянул на пользовательскую ссылку итератора. где я могу перейти в каталог, в который я хочу развернуть? – yeahumok

+0

'GetFilesRecursive (dirInfo);' - просто передать root dirInfo – slf

1

File.Move() эффективно переименовывает файлы. В принципе, вам просто нужно

File.Move(fileNames, sanitized); 

внутри последний цикл.

ALERT - возможно, там будет дублированные имена файлов, так что вы должны будете установить политику, чтобы избежать этого, как добавление счетчика в конце переменной sanitized. Кроме того, примените правильную обработку исключений.

PS: Конечно, вам не нужно искать символы, такие как :\*.

+0

Нужно ли здесь указывать if/else? Или если файл не имеет недопустимых символов, он автоматически пропустит его? – yeahumok

+0

@yeahumok, вы действительно можете сравнить 'fileNames' с' sanitized', чтобы избежать ненужного вызова 'File.Move()'. Однако обратите внимание на дубликаты (например, '# File.txt' и' ~ File.txt' будет называться 'File.txt') и проверьте разрешения доступа, дисковое пространство и другие исключения IO. – Humberto