C#字符串插值抛出IOException

时间:2015-11-04 17:05:38

标签: c# string-interpolation c#-6.0

我有一个奇怪的问题,我想知道是否有其他人曾经遇到过这个问题。也许我做错了什么,有人可以指出我做错了什么。

问题是,我正在创建一个zip文件并在其中添加一堆文件。我将zip创建包装在using中,应该在完成向其添加文件后正确关闭zip文件。奇怪的是,当我使用常规字符串作为文件的路径时,一切正常。当我使用字符串插值来创建路径而不是常规字符串时,它会抛出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 = $@"{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()行取消注释$@"{destinationDirectory}\{zipFilename}"行时,它会抛出IOException。

有关为何会这样做的任何想法?字符串插值是以某种方式在文件上保存句柄而不释放它吗?

2 个答案:

答案 0 :(得分:4)

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

您可以使用和不使用字符串插值在不同命名的文件上测试程序,以确保。

答案 1 :(得分:0)

您的代码非常完美,还有其他导致IOException的内容。 我厌倦了在你提到的两个场景中运行你的代码,它的工作很好。