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文件。
//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 日志记录的性能为负,如此处所示。