ZipFile.CreateFromDirectory抛出System.IO.IOException:由于正在被另一个进程使用,因此无法访问文件X。

4

实际上我正在尝试创建一个目录的压缩文件,但是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);
}

非常感谢您的帮助。提前致谢。:)


请查看 Path.CombinePath.ChangeExtension - Gilad Green
2
您正在尝试将一个目录归档并将其压缩文件放置在相同的目录中。当然会出现错误,把压缩文件路径更改到另一个目录即可解决问题。 - Softe Eng
实际上,我正在尝试将一个目录归档并将其放置在其直接父目录中。例如:路径:DirA / DirB / DirC:我想压缩DirC并将其放置在DirB中。这就是我想要实现的。 - Haider
我的代码虽然将文件压缩并放置在正确的目录中,但也会给我抛出异常。 - Haider
显示剩余2条评论
3个回答

3

你收到这个异常是有道理的。 让我们逐步调查你的代码:

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中时,您还将尝试压缩文件本身。这实际上就是您遇到的文件正在使用错误的原因。
所以,
  1. 用File.Exists()替换Directory.Exists()

  2. 在另一个文件夹中进行压缩

  3. 只是一个友好的提醒,如果我是您,我会对Directory.Delete()保持谨慎 :)


我会对Directory.Delete()保持谨慎。你是基于经验还是道听途说而言? - rene
出于经验,他可能正在尝试删除包含实际zip文件以及他试图压缩的所有其他文件的文件夹 :) 因此最终他将手头一无所有。 - uTeisT
最后我会有压缩文件。保留文件夹和压缩文件都没有意义。将来如果我需要数据,我只需提取压缩文件即可。 :) - Haider
@Haider,这是因为你代码中的Directory.Delete(DirectoryToBeArchive);根本没有做任何事情。因为根据你的示例,可能没有名为PATH_TO_CREATE_ZIP/file的目录。这只是提醒你,以防意外删除文件夹。顺便说一下,我相信我使用File.Exists()而不是Directory.Exists()的答案帮助你解决了问题。如果确实有帮助,请将其标记为答案。谢谢。 - uTeisT
在阅读您的答案前的10分钟,我已经找出了这些问题并在我的代码中进行了修正。但是,由于您的答案非常有帮助,所以我会将其标记为解决方案。感谢您的帮助。 :) - Haider

1

我的问题在于,输出文件夹和压缩文件夹是相同的。
将它们移动到不同的文件夹中后,现在正常工作。


0

正确代码:

经过一点修改后,这段代码对我有效。

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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接