2016-01-24 165 views
3

我有一個控制檯應用程序,我爲自己構建了用於重命名我下載的.mp3文件。這個應用程序已經完美運行了好幾個月,但突然之間在一個特定的目錄下拋出了標題爲例外的情況。它不僅是一個目錄,而且僅在一定數量的文件上發生 - 其中3個已成功重命名。DirectoryNotFoundException - 找不到路徑的一部分

這裏是我的目錄路徑和文件:

enter image description here

這裏就是拋出異常的目錄路徑的一個片段,有異常的消息一起:

enter image description here

這裏是我的代碼:

static void Main(string[] args) { 
    string dir = @"M:\Temp Downloading Folder"; 

    var files = new DirectoryInfo(dir + @"\Gregory Alan Isakov Discography [2005 - 2013]\Rust Colored Stones").GetFiles("*.mp3").ToList(); 

    foreach (var item in files) { 
     if (item.Name.Substring(0, 2).All(char.IsDigit)) { 
      //string fullName = item.FullName.Replace("\\", "/"); 
      string newName = "Gregory Alan Isakov "; 
      //exception thrown here 
      File.Move(item.FullName, item.FullName.Replace(item.Name.Substring(0, 3), newName)); 
     } 
    } 
    Console.WriteLine("Done!"); 
    Console.ReadKey(); 
} 

我嘗試改變路徑以使/而不是\\具有相同的結果。

按照Documentation on MSDN

當一個文件或目錄的一部分,無法 被發現時引發的異常。

然而,目錄是發現和正確地重新命名爲第一3個文件(作爲第一圖像中描繪的)。

任何人都可以向我解釋爲什麼會發生這種情況嗎?

+0

此表達式的打印值'item.FullName.Replace(item.Name.Substring(0,3),newName)'。 – PetSerAl

+0

可能是文件夾名稱太長了?在相同的文件上嘗試更短的路徑,看看是否會產生相同的錯誤。 – Chase

+0

這是獲取文件的常見問題。它搜索子文件夾,並會在發生任何異常時中止。要繼續搜索,您需要有一個異常處理程序,該異常處理程序將在異常後繼續搜索。正確做到這一點的唯一方法是具有遞歸功能。 – jdweng

回答

4

您的代碼更改文件夾,而不是文件名,運行你的代碼中的錯誤:

C:\ TEMP下載文件夾\格雷戈裏·艾倫·伊薩科夫唱片[2005 - 2013] \鐵鏽色的石頭\ 05 - 只有Ghosts.mp3

改爲:

C:\ TEMP文件夾下載\格雷戈裏·艾倫·伊薩科夫唱片[20 格雷戈裏 艾倫伊薩科夫 - 2013] \鐵鏽色的石頭\格雷戈裏·艾倫·伊薩科夫 - 只有 Ghosts.mp3

我讓你調試和修復它自己。

+0

你確定?如果這只是一個錯誤,我會很樂意刪除這個問題,但我實際上沒有得到那個結果。 –

+1

嘗試在你的'File.Move(...)之前輸出所有的字符串,你會看到。 – 2016-01-24 17:04:04

+2

Yup現在看到了,似乎與文件路徑有關,包括'05',與文件名相同。好吧,我會把這個問題留下來,因爲其他人可能會陷入和我一樣的陷阱。 –

0

問題可能是由於您的文件夾路徑的長度。縮短長度並重試。

Microsoft's documentation on file naming and path lengths提到Windows對路徑的總長度加上它的文件名限制了260個字符限制;這個被引用的最大路徑長度的限制,這裏列出,方便參考:

在Windows API(在以下 段落中討論一些例外),對於路徑的最大長度爲MAX_PATH,這是 定義爲260個字符。本地路徑的結構如下 順序:驅動器號,冒號,反斜槓,由 反斜槓分隔的名稱組件,以及終止空字符。例如,驅動器D上的最大路徑 是「D:\某些256個字符的路徑字符串」 其中「」表示當前系統代碼頁的不可見的終止空字符。 (字符<>在這裏用於 視覺清晰度,並不能有效的路徑字符串的一部分。)

但是,如果你在使用路徑名作爲-是堅持,你可以探索使用擴展通過用「\?」前綴路徑來擴展路徑名稱約定符號。

在Windows API具有許多功能也具有Unicode的版本,以允許 用於 32,767個字符的最大總路徑長度的延伸長度的路徑。此類路徑由用反斜槓分隔的組件 組成,每個組件由GetVolumeInformation 函數(此值通常爲255個字符)的 lpMaximumComponentLength參數返回的值。要指定 擴展長度路徑,請使用「\?\」前綴。例如,「\?\ D:\很 長路徑」。

+0

我沒有投票,但是我沒有完全意識到我犯的愚蠢錯誤,所以我帶領你走下了花園。 Nima Ara'的回答其實是對的,我在我的評論中解釋了它的問題。 –

+0

已更新的答案您可能也會遇到此問題,因此我認爲這是值得發佈的內容:) – Chase

+0

是的,請詳細解釋 - 給誰這樣做。我的迴應似乎很重要,即使這不是問題的實際解決方案。 – Chase

相關問題