c#ZipFile.CreateFromDirectory - 进程无法访问文件"path_to_the_zip_file_created.zip",因为它正被另一个进程使用

DJD*_*DJD 37 .net c#

基本代码:

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

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

上面的设置在我安装了Visual Studio的Windows 7上工作正常,但在Windows Server 2008R2上运行时收到上述错误消息.

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

Ema*_*eco 84

//WRONG
ZipFile.CreateFromDirectory("C:\somefolder", "C:\somefolder\somefile.zip");
//RIGHT     
ZipFile.CreateFromDirectory("C:\somefolder", "C:\someotherfolder\somefile.zip");
Run Code Online (Sandbox Code Playgroud)

我用来做同样的错误:将文件压缩到我正在压缩的同一个文件夹中.
当然,这会导致错误.

  • 当你意识到解决方案如此明显时,这样的“呃”点......谢谢 (2认同)

Str*_*ior 7

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


Kyl*_*son 6

我有同样的问题.解决方法是将您正在压缩的文件夹复制到另一个文件夹,并在那里指向CreateFromDirectory.不要问我为什么会这样,但确实如此.

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

  • 您也可以尝试_not在zipped_目录中编写zipfile. (12认同)

小智 5

其他答案提供了正确的原因,但是我对第一眼的理解有些疑问。我无法发表评论,因此将其作为答案。以后访问此页面的人可能会很容易。

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