2015-11-04 72 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。 我厌倦了在你提到的两种情况下运行你的代码,它的作品很好。