2015-11-04 79 views
0

我有一個奇怪的問題,我想知道是否有其他人遇到過這個。也許我做錯了什麼,有人可以指出我做錯了什麼。C#字符串插值拋出IOException

問題是,我正在創建一個zip文件並向其中添加一堆文件。我正在將壓縮文件創建爲using,該文件應在完成添加文件後正確關閉該壓縮文件。奇怪的是,當我使用文件路徑的常規字符串時,一切正常。當我使用字符串插值創建路徑而不是常規字符串時,它會拋出IOException「進程無法訪問該文件,因爲它正在被另一個進程使用」。

下面的代碼:

try 
{ 
    string sourceDirectory = @"c:\path\to\files\that\need\zipping"; 
    string destinationDirectory = @"c:\path\to\zip\file"; 
    string zipFilename = "someFilename.zip"; 
    string filename = string.Format(@"{0}\{1}", destinationDirectory, zipFilename); 
    //string filename = [email protected]"{destinationDirectory}\{zipFilename}"; 
    using (ZipArchive zip = ZipFile.Open(filename, ZipArchiveMode.Create)) 
    { 
     foreach (string pathToFile in Directory.GetFiles(sourceDirectory)) 
     { 
      zip.CreateEntryFromFile(pathToFile, Path.GetFileName(pathToFile)); 
     } 
    } 
} 
catch (IOException ex) 
{ 
    // Lands here when using string interpolation. 
} 

上面的代碼工作,並且不拋出IOException。但是,當我註釋掉string.Format()行時取消註釋[email protected]"{destinationDirectory}\{zipFilename}"行,它會拋出IOException。

有什麼想法,爲什麼它會這樣做?字符串插值以某種方式在文件上持有句柄而不釋放它?

+3

你需要'@'在你的路徑之前。 – i3arnon

+0

對不起。那些在那裏,只是沒有包含在這篇文章中。我已經更新了它。 – smoothgrips

+3

這被編譯爲[完全相同的代碼(http://tryroslyn.azurewebsites.net/#K4Zwlgdg5gBAygTxAFwKYFsDcAoADsAIwBswBjGUogQxBBgGEYBvbGNmfYsmANwHswAExgBZABQBKZq3YoATpFiDUKSFWRg+EACJg5qUsj5yEMALwwAAgCJSALgA6udQAsHRhwC8wuBwDMwIlRrHHYYeUUYb1wAMUDUCCp0VHMYaxA+ZLigxOSAOmiQmTYI6BgAnKSUi1KoPJjjdHUxGyYABgBfByYARg7rABoYZVVEjS1dfUNjBCHo7ISqiVDZZAUyisXkgCZUgBJWkY0xzR09AyMTLqZ5+NzUfpW2DuwOoAA==)。你確定這是什麼? – i3arnon

回答

3

字符串插值不能拋出IOException。以下行可能引發異常:using (ZipArchive zip = ZipFile.Open(filename, ZipArchiveMode.Create))

您可以測試程序有無字符串插值以確保不同名稱的文件。

0

你的代碼是完美的,還有其他的東西會導致IOException。 我厭倦了在你提到的兩種情況下運行你的代碼,它的作品很好。

相關問題