【问题标题】:c# ZipFile.CreateFromDirectory - the process cannot access the file "path_to_the_zip_file_created.zip" because it is being used by another processc# ZipFile.CreateFromDirectory - 进程无法访问文件“path_to_the_zip_file_created.zip”,因为它正被另一个进程使用
【发布时间】:2013-10-16 04:15:12
【问题描述】:

基本代码:

string startPath = @"C:\intel\logs";
string zipPath = @"C:\intel\logs-" + DateTime.Now.ToString("yyyy_dd_M-HH_mm_ss") + ".zip";
ZipFile.CreateFromDirectory(startPath, zipPath);

错误:进程无法访问文件“path_to_the_zip_file_created.zip”,因为它正被另一个进程使用。

上述设置在我安装了 Visual Studio 的 Windows 7 上运行良好,但在 Windows Server 2008R2 上运行时出现上述错误消息。

我检查了防病毒日志,它没有阻止应用程序,也没有锁定创建的 zip 文件。

【问题讨论】:

  • 你发现问题了吗?
  • 这正是发生在我身上的事情。
  • 压缩文件正在尝试压缩文件夹的所有内容,但在读取文件夹的同时写入。这会导致它尝试自行压缩。下面的答案表明您不能将 zip 文件存储在您正在压缩的文件夹中。
  • @KyleShrader 不,他正在将“日志”压缩到“intel”并将结果放入“intel”。

标签: c# .net


【解决方案1】:
//WRONG
ZipFile.CreateFromDirectory("C:\somefolder", "C:\somefolder\somefile.zip");
//RIGHT     
ZipFile.CreateFromDirectory("C:\somefolder", "C:\someotherfolder\somefile.zip");

我曾经犯过同样的错误:将文件压缩到我要压缩的文件夹中
这当然会导致错误。

【讨论】:

    【解决方案2】:

    我在尝试压缩正在运行的应用程序正在积极写入日志文件的文件夹时遇到了这个问题。凯尔约翰逊的答案可能有效,但它增加了复制文件夹的开销以及事后清理副本的必要性。即使正在写入日志文件,以下代码也会创建 zip:

    void SafelyCreateZipFromDirectory(string sourceDirectoryName, string zipFilePath)
    {
        using (FileStream zipToOpen = new FileStream(zipFilePath, FileMode.Create))
        using (ZipArchive archive = new ZipArchive(zipToOpen, ZipArchiveMode.Create))
        {
            foreach (var file in Directory.GetFiles(sourceDirectoryName))
            {
                var entryName = Path.GetFileName(file);
                var entry = archive.CreateEntry(entryName);
                entry.LastWriteTime = File.GetLastWriteTime(file);
                using (var fs = new FileStream(file, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
                using (var stream = entry.Open())
                {
                    fs.CopyTo(stream, 81920);
                }
            }
        }
    }
    

    【讨论】:

    • 我遇到了同样的情况,感谢您提供干净的解决方案
    • 这符合我的要求。我修改了这段代码:Directory.GetFiles(sourceDirectoryName).Where(f => f.EndsWith(".zip") == false)。这样新创建的 zip 文件就不会包含在这组中。
    【解决方案3】:

    我遇到了完全相同的问题。解决方法是将要压缩的文件夹复制到另一个文件夹,然后将 CreateFromDirectory 指向那里。不要问我为什么这样有效,但确实有效。

    Directory.CreateDirectory(<new directory path>);
    File.Copy(<copy contents into new folder>);
    ZipFile.CreateFromDirectory(<new folder path>, <zipPath>);
    

    【讨论】:

    • 您也可以尝试不要将压缩文件写入正在压缩的目录中
    • Yuo 天才@CodeCaster .. 我很傻,试图将文件压缩到同一个文件夹中!
    • 对我来说,这个答案在尝试备份网站时是正确的。唯一被进程锁定的文件是日志文件(感谢 Log4Net!),我不关心备份。
    【解决方案4】:

    其他答案,提供了正确的原因,但我在第一眼就理解它们时遇到了一点问题。我无法发表评论,因此将此作为答案。对于以后访问这里的人来说可能很容易。

    如果正在创建的 Zip 文件的路径与提供给 ZipFile.CreateFromDirectory 的路径相同,则 ZipFile 会创建所需的 zip 文件并开始将目录中的文件添加到其中。最后,尝试将所需的 zip 文件也添加到 zip 中,因为它位于同一目录中。这是不可能的,也不是必需的,因为 CreateFromDirectory 方法正在使用所需的 zipfile。

    【讨论】:

      【解决方案5】:

      如果您收到此错误是因为 NLog 正在锁定您的日志文件,您可以使用以下解决方法。将“keepFileOpen”属性添加到 NLog.config 中的 nlog 标记并将其设置为 false:

      <nlog xmlns=.......
         keepFileOpen="false"
      ....>
      

      更多详情here.

      请注意,此设置将对 NLog 日志记录产生负面影响,如 here 所示。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-07-05
        • 2011-04-17
        • 2016-12-24
        • 2013-06-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多