ZipFile.CreateFromDirectory 抛出 System.IO.IOException :该进程无法访问文件 X,因为它正在被另一个进程使用
Posted
技术标签:
【中文标题】ZipFile.CreateFromDirectory 抛出 System.IO.IOException :该进程无法访问文件 X,因为它正在被另一个进程使用【英文标题】:ZipFile.CreateFromDirectory throws System.IO.IOException : The process cannot access the file X because it is being used by another process 【发布时间】:2016-08-04 12:09:41 【问题描述】:实际上我正在尝试创建一个目录的 zip 文件,但 ZipFile.CreateFromDirectory()
给出了以下异常。
System.IO.IOException : 进程无法访问文件 PATH_TO_CREATE_ZIP/file.zip' 因为它正在被另一个人使用 过程。
以下是它的代码片段。 :
public void createZipFile(string zipPath, string archiveFileName)
string DirectoryToBeArchive = zipPath + "\\" + archiveFileName;
if (Directory.Exists(DirectoryToBeArchive + ".zip"))
File.Delete(DirectoryToBeArchive);
ZipFile.CreateFromDirectory(zipPath, DirectoryToBeArchive + ".zip", CompressionLevel.Fastest, false);
else
ZipFile.CreateFromDirectory(zipPath, DirectoryToBeArchive + ".zip", CompressionLevel.Fastest, false);
Directory.Delete(DirectoryToBeArchive);
非常感谢您的帮助。提前致谢。 :)
【问题讨论】:
c# ZipFile.CreateFromDirectory - the process cannot access the file "path_to_the_zip_file_created.zip" because it is being used by another process的可能重复 看看Path.Combine
和Path.ChangeExtension
您正在尝试归档一个目录并将 zip 文件放在您正在归档的同一目录中。当然你会得到这个错误,将zip文件的路径更改为另一个目录
实际上我正在尝试存档一个目录并将其放在其直接父目录中。 E-G : Path : DirA / DirB / DirC : 我想压缩 DirC 并将其放在 DirB 中。这就是我想要实现的目标。
我的代码虽然压缩文件并将其放在正确的目录中,但它也给了我例外。
【参考方案1】:
只有遇到此异常才有意义。让我们逐步调查您的代码:
createZipFile("C:\\Temp", "myZipFile");
public void createZipFile(string zipPath, string archiveFileName)
//DirectoryToBeArchive = "C:\\Temp\\myZipFile"
string DirectoryToBeArchive = zipPath + "\\" + archiveFileName;
//Some logical error here, you probably meant to use File.Exists()
//Basically, as you can't find a directory with name C:\\Temp\\myZipFile.zip, you always jump into else
if (Directory.Exists(DirectoryToBeArchive + ".zip"))
File.Delete(DirectoryToBeArchive);
ZipFile.CreateFromDirectory(zipPath, DirectoryToBeArchive + ".zip", CompressionLevel.Fastest, false);
else
//It will try to overwrite your existing "DirectoryToBeArchive".zip file
ZipFile.CreateFromDirectory(zipPath, DirectoryToBeArchive + ".zip", CompressionLevel.Fastest, false);
//This won't work as well btw, as there probably is no directory
//with name C:\\Temp\\myZipFile
Directory.Delete(DirectoryToBeArchive);
尽管如此,即使您删除该文件,您也可能会遇到同样的错误。
问题是当您尝试将文件夹C:\\Temp
压缩到文件C:\\Temp\\myZipFile.zip
中时,您还将尝试压缩文件本身。这实际上是你得到文件正在使用错误的地方。
所以,
将 Directory.Exists() 替换为 File.Exists()
压缩到另一个文件夹
只是一个友好的警告,如果我是你,我会小心使用 Directory.Delete() :)
【讨论】:
我会小心使用 Directory.Delete() 你说的只是道听途说的经验? 经验不足。此外,他可能正试图删除实际 zip 文件所在的文件夹,以及他试图压缩的所有其他文件 :) 所以最后,他将一无所有 我会在最后得到压缩文件。保留文件夹和 zip 文件没有意义。将来,如果我需要数据,我将只提取 zip 文件。 :) @Haider 那是因为你的代码中的Directory.Delete(DirectoryToBeArchive);
根本没有做任何事情。因为根据您的示例,可能没有名称为 PATH_TO_CREATE_ZIP/file
的目录。这只是提醒您,以防止意外删除文件夹。顺便说一句,我相信我使用File.Exists()
而不是Directory.Exists()
的回答可以帮助您解决问题。如果有,您可以将其标记为答案吗?泰
就在阅读您的答案的 10 分钟之前,我准确地弄清楚了这些事情并在我的代码中使它们正确。但是因为您的回答非常有帮助。所以我要标记它。感谢您的帮助.. :)【参考方案2】:
正确代码:
经过少许修正后的这段代码对我有用..
string DirectoryToBeArchive = zipPath + "\\" + archiveFileName;
if (File.Exists(DirectoryToBeArchive + ".zip"))
File.Delete(DirectoryToBeArchive + ".zip");
ZipFile.CreateFromDirectory(DirectoryToBeArchive, DirectoryToBeArchive + ".zip", CompressionLevel.Fastest, false);
else
ZipFile.CreateFromDirectory(DirectoryToBeArchive, DirectoryToBeArchive + ".zip", CompressionLevel.Fastest, false);
Directory.Delete(DirectoryToBeArchive , true);
【讨论】:
【参考方案3】:我的问题是,输出文件夹和压缩文件夹是相同的。 移动到单独的文件夹,现在工作正常。
【讨论】:
以上是关于ZipFile.CreateFromDirectory 抛出 System.IO.IOException :该进程无法访问文件 X,因为它正在被另一个进程使用的主要内容,如果未能解决你的问题,请参考以下文章