47

基本代码:

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

4

5 回答 5

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

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

于 2014-06-19T10:41:55.307 回答
12

我遇到了这个问题,因为我试图压缩正在运行的应用程序正在积极写入日志文件的文件夹。凯尔约翰逊的答案可能有效,但它增加了复制文件夹的开销以及事后清理副本的必要性。即使正在写入日志文件,以下代码也会创建 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);
            }
        }
    }
}
于 2018-09-19T22:57:13.050 回答
8

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

Directory.CreateDirectory(<new directory path>);
File.Copy(<copy contents into new folder>);
ZipFile.CreateFromDirectory(<new folder path>, <zipPath>);
于 2014-01-27T13:31:21.950 回答
6

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

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

于 2015-01-26T05:46:15.743 回答
0

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

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

更多细节在这里

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

于 2019-05-21T16:54:56.723 回答