Я пытаюсь переименовать файлы что мои списки программ как имеющий "запрещенные символы" для импорта файла SharePoint. Запрещенные символы, к которым я обращаюсь: ~ # % и * {} / \|: <>? -""
То, что я пытаюсь сделать, рекурсивно вызывают через диск, собирают список имен файлов и затем через Регулярные выражения, выбирают имена файлов из Списка и попытки заменить недопустимые символы в самих фактических именах файлов.
У кого-либо есть какая-либо идея, как сделать это? До сих пор у меня есть это: (помните, я - полный 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();
}
}
Таким образом, то, что я должен выяснить, - то, как рекурсивно искать эти недопустимые символы, заменить их в самом фактическом имени файла. У кого-либо есть какие-либо идеи?
Когда вы рекурсивно работаете с файлами и каталогами, во много раз проще использовать класс DirectoryInfo и его члены вместо статических методов. Для вас есть предварительно построенная древовидная структура, поэтому вам не нужно управлять ею самостоятельно.
GetDirectories возвращает больше экземпляров DirectoryInfo, чтобы можно было пройтись по дереву, а GetFiles возвращает объекты FileInfo .
Этот парень создал собственный итератор для рекурсивного получения информации о файле, которая, если вы объедините ее с существующей работой с регулярным выражением, завершит ваше решение.
File.Move () эффективно переименовывает файлы. По сути, вам просто нужно
File.Move(fileNames, sanitized);
внутри последнего цикла.
ПРЕДУПРЕЖДЕНИЕ - возможно, будут повторяющиеся имена файлов, поэтому вам придется установить политику, чтобы избежать этого, например, добавление счетчика в конце переменной sanitized
. Кроме того, примените правильную обработку исключений.
PS: Конечно, вам не нужно искать символы типа : \ *
.