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.CombinePath.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() 你说的只是道听途说的经验? 经验不足。此外,他可能正试图删除实际 zi​​p 文件所在的文件夹,以及他试图压缩的所有其他文件 :) 所以最后,他将一无所有 我会在最后得到压缩文件。保留文件夹和 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,因为它正在被另一个进程使用的主要内容,如果未能解决你的问题,请参考以下文章