2010-06-16 139 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#和想寫通過特定驅動遞歸的應用,發現無效字符(如正則表達式指定),從文件名中刪除它們,並然後編寫一個具有路徑名和修正的文件名的.txt文件。

任何想法?

+5

如果您是C#的新手,請不要在沒有處理異常的情況下嘗試/ catch;你很可能無視錯誤信息來解釋發生了什麼問題。 – Flynn1179 2010-06-16 15:05:11

+1

找出爲什麼'File.Move()'不起作用可以通過不將塊封裝在抓取和釋放流中而變得更容易一些。 – Lance 2010-06-16 15:05:26

+2

對於新程序員來說很不錯。現在,看到空的'catch {}'塊?這就是你沒有看到真正的錯誤的原因!嘗試'catch(Exception ex){Console.Write(ex); }' – Kobi 2010-06-16 15:06:03

回答

6

您的文件路徑列表僅包含文件名稱。在調用Path.GetFileName()時,您已經從它們中刪除了目錄信息,因此您的File.Move正在應用程序的默認目錄中查找目標文件,而不是其原始位置。

我認爲你的代碼保存清理文件名是正確的。儘管如此,您應該在StreamWriter周圍使用using()構造,以確保文件在完成後關閉。

//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 2010-06-16 15:13:03

+0

@尼爾:好眼睛! @yeahumok:這是正確的。 ;) – Lance 2010-06-16 15:15:57

+1

只要確保您不會意外地清理文件夾名稱,或者您會收到錯誤信息,因爲您將嘗試將文件移至不存在的「已清理過的」文件夾(如果有的話) '無效字符)。 「File.Move(Path.Combine(folder,Files2),Path.Combine(folder。sanitized))'''其中'folder'與上面使用的是相同的。 – Flynn1179 2010-06-16 15:18:44

2

調用File.Move()時是否引發任何異常?你的下面有一個空的catch塊,它會阻止你看到它們。嘗試移除catch {}或在其中放置一些代碼以記錄任何異常。

1

嘗試使用File.AppendAllLines()(與收集)或File.AppendAllText()(對於每個單獨),而不是流。這會讓事情變得更簡單。

此外,我不理解您的應用程序是否需要轟炸,但至少在您正在編寫/調試時註釋您的try擋,以便您可以看到例外情況。

可能不是一個答案,但也許是一個建議來幫助。