2010-06-16 4 views
1

Я не уверен, что именно я делаю неправильно здесь ... но я заметил, что мой File.Move() не переименовывает никаких файлов.
Кроме того, кто-нибудь знает, как в моем втором цикле я мог бы заполнить мой .txt-файл списком пути И дезинформированного имени файла?Почему мой файл File.Move() не работает?

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.IO; 
using System.Text.RegularExpressions; 

namespace ConsoleApplication2 
{ 
class Program 
{ 
    static void Main(string[] args) 
    { 

     //recurse through files. Let user press 'ok' to move onto next step   
     string[] files = Directory.GetFiles(@"C:\Documents and Settings\jane.doe\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); 
     //End section 

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

     string[] fileDrive = Directory.GetFiles(@"C:\Documents and Settings\jane.doe\Desktop\~Test Folder for [SharePoint] %testing", "*.*", SearchOption.AllDirectories); 
     List<string> filePath = new List<string>(); 

     //clean out file -- remove the path name so file name only shows 
     string result;    
     foreach(string fileNames in fileDrive) 
     { 
     result = Path.GetFileName(fileNames); 
     filePath.Add(result); 

     } 

     StreamWriter sw = new StreamWriter(@"C:\Documents and Settings\jane.doe\Desktop\~Test Folder for [SharePoint] %testing\File_Renames.txt"); 

     //Sanitize and remove invalid chars 
     foreach(string Files2 in filePath) 
     { 
      try 
      { 
       string sanitized = regEx.Replace(Files2, replacement); 
       sw.Write(sanitized + "\r\n"); 
       System.IO.File.Move(Files2, sanitized); 
       System.IO.File.Delete(Files2); 




      } 
      catch (Exception ex) 
      { 
      Console.Write(ex); 
      } 


     } 
     sw.Close(); 

    } 

} 

}

Я новичок в C# и пытается написать приложение, которое рекурсивно через определенный диск, находит недопустимые символы (как указано в шаблоне RegEx), удаляет их из файла и затем напишите TXT-файл с именем пути и исправленным именем файла.

Любые идеи?

+5

Если вы новичок в C#, НИКОГДА не выполняйте попытку/улов без обработки исключения; вы, вероятно, игнорируете сообщение об ошибке, которое объяснит, что случилось. – Flynn1179

+1

Выяснение причин, по которым 'File.Move()' не работает, может немного упроститься, не упаковывая блок в поток catch-and-release. – Lance

+2

Довольно хорошо для нового программиста. Теперь, видите, что пустой блок 'catch {}'? Вот почему вы не видите настоящую ошибку! try 'catch (Exception ex) {Console.Write (ex); } ' – Kobi

ответ

6

В списке ваших файлов по имени файла есть names. Вы удалили информацию о каталоге из них в вызове Path.GetFileName(), поэтому ваш File.Move ищет целевой файл в каталоге по умолчанию приложения, а не его исходное местоположение.

Я думаю, что ваш код для сохранения дезинфицированных имен файлов является правильным. Вы должны использовать конструкцию using() вокруг вашего StreamWriter, хотя, как показано ниже, чтобы гарантировать, что файл будет закрыт, как только вы закончите с ним.

//clean out file -- remove the path name so file name only shows 
string result;    
foreach(string fileNames in fileDrive) 
{ 
    // result = Path.GetFileName(fileNames); // don't do this. 
    filePath.Add(fileNames); 
} 

using (StreamWriter sw = new StreamWriter(@"C:\Documents and Settings\jane.doe\Desktop\~Test Folder for [SharePoint] %testing\File_Renames.txt")) 
{ 
     //Sanitize and remove invalid chars 
     foreach(string Files2 in filePath) 
     { 
      try 
      { 
       string filenameOnly = Path.GetFileName(Files2); 
       string pathOnly = Path.GetDirectoryName(Files2); 
       string sanitizedFilename = regEx.Replace(filenameOnly, replacement); 
       string sanitized = Path.Combine(pathOnly, sanitizedFilename); 
       sw.Write(sanitized + "\r\n"); 
       System.IO.File.Move(Files2, sanitized); 
      } 
      catch 
      { 
      } 
     } 
} 
+0

Итак, если я НЕ использую GetFileName() и вместо этого передаю весь путь к File.Move()? – yeahumok

+0

@Neil: Хороший глаз! @yeahumok: Это правильно. ;) – Lance

+1

Просто убедитесь, что вы случайно не дезактивируете имя папки, или вы получите сообщение об ошибке, потому что вы попытаетесь переместить файл в папку «sanitized», которая не существует (если она есть 'недопустимые символы). Что-то в строках 'File.Move (Path.Combine (папка, Files2), Path.Combine (папка. Sanitized))' где 'folder' - тот же, который вы использовали выше. – Flynn1179

2

Существуют ли исключения в вызове File.Move()? У вас есть пустой блок catch под ним, который будет мешать вам видеть их. Попробуйте удалить catch {} или поместив там какой-нибудь код для регистрации каких-либо исключений.

1

Попробуйте использовать File.AppendAllLines() (с коллекцией) или File.AppendAllText() (для каждого в отдельности) вместо потока. Это упростит ситуацию.

Кроме того, я понимаю, что вы не хотите, чтобы ваше приложение бомбило, но по крайней мере, пока вы в настоящее время пишете/отлаживаете комментарий, ваш блок try блокируется, чтобы вы могли видеть исключения.

Возможно, это не ответ, а, возможно, предложение помочь.

Смежные вопросы