[英]C# string interpolation throws IOException
我有一个奇怪的问题,想知道以前是否有人遇到过。 也许我做错了什么,有人可以指出我做错了什么。
问题是,我正在创建一个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。
有什么想法为什么要这么做呢? 字符串插值是否以某种方式握住了文件的句柄而不释放它?
字符串插值不能抛出IOException
。 以下行可能引发异常: using (ZipArchive zip = ZipFile.Open(filename, ZipArchiveMode.Create))
。
确保可以在不同名称的文件上使用字符串插入和不使用字符串插入来测试程序。
您的代码是完美的,还有其他原因导致IOException。 在您提到的两种情况下,我都很难运行您的代码,它的效果很好。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.