【发布时间】: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