【问题标题】:C# string interpolation throws IOExceptionC# 字符串插值抛出 IOException
【发布时间】:2015-11-04 17:05:37
【问题描述】:

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

问题是,我正在创建一个 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。

关于它为什么会这样做的任何想法?字符串插值是否以某种方式持有文件的句柄而不释放它?

【问题讨论】:

  • 两条路径前都需要@
  • 对不起。那些都在那里,只是没有包含在这篇文章中。我已经更新了。
  • 编译成exactly the same code。你确定那是抛出的东西吗?
  • 我认为异常很清楚:IOException“进程无法访问该文件,因为它正在被另一个进程使用”。格式错误的字符串不会导致它被另一个进程使用。
  • 尝试在filename 创建后添加断点,并在这两种情况下检查它。如果生成的字符串相同,那么您的问题根本不在于字符串插值。如果不一样,要么你写错了,要么C#编译器有bug。

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


【解决方案1】:

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

您可以在不同命名的文件上测试带有和不带有字符串插值的程序。

【讨论】:

    【解决方案2】:

    您的代码很完美,还有其他原因导致 IOException。 我厌倦了在您提到的两种情况下运行您的代码,效果很好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-12
      • 1970-01-01
      相关资源
      最近更新 更多