c# ZipFile.CreateFromDirectory - 进程无法访问文件“path_to_the_zip_fi

本文关键字:path to the fi zip 文件 访问 CreateFromDirectory ZipFile 进程 | 更新日期: 2023-09-27 18:35:43

基本代码:

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文件。

c# ZipFile.CreateFromDirectory - 进程无法访问文件“path_to_the_zip_fi

//WRONG
ZipFile.CreateFromDirectory("C:'somefolder", "C:'somefolder'somefile.zip");
//RIGHT     
ZipFile.CreateFromDirectory("C:'somefolder", "C:'someotherfolder'somefile.zip");

曾经做过同样的错误:将文件压缩到我正在压缩的同一文件夹中
当然,这会导致错误。

我遇到了这个问题,因为我试图压缩正在运行的应用程序主动写入日志文件的文件夹。Kyle Johnson 的答案可能可行,但它增加了复制文件夹的开销以及之后清理副本的必要性。下面是一些代码,即使日志文件正在写入,它们也会创建 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);
            }
        }
    }
}

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

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

其他答案提供了正确的理由,但我在第一眼理解它们时遇到了一点问题。

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

如果由于 NLog 锁定日志文件而收到此错误,则可以使用以下解决方法。 将 'keepFileOpen' 属性添加到 NLog.config 中的 nlog 标签中,并将其设置为 false:

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

更多细节在这里。

请注意,此设置对 NLog 日志记录的性能为负,如此处所示。