ZipFile.ExtractToDirectory在.Net-Core 2.0上失败

时间:2017-10-03 23:44:03

标签: .net-core zipfile

我有一个.Net-Core项目在1.1上工作正常但现在在2.0上失败了。当我尝试使用ZipFile.ExtractToDirectory(来自System.IO.Compression)解压缩zip存档时,会发生此问题。我得到一个或两个文件,但随后它会抛出一条消息:

The process cannot access the file '<path to file>' because it is being used by another process.

据我所知,没有其他进程可能正在使用该文件,因为它刚刚被提取出来。当我收到错误时,它实际上存在于磁盘上。

堆栈跟踪是:

at System.IO.Win32FileSystem.OpenHandle(String fullPath, Boolean asDirectory)
at System.IO.Win32FileSystem.SetLastWriteTimeInternal(String fullPath, DateTimeOffset time, Boolean asDirectory)
at System.IO.Win32FileSystem.SetLastWriteTime(String fullPath, DateTimeOffset time, Boolean asDirectory)
at System.IO.File.SetLastWriteTime(String path, DateTime lastWriteTime)
at System.IO.Compression.ZipFileExtensions.ExtractToFile(ZipArchiveEntry source, String destinationFileName, Boolean overwrite)
at System.IO.Compression.ZipFileExtensions.ExtractToDirectory(ZipArchive source, String destinationDirectoryName, Boolean overwrite)
at System.IO.Compression.ZipFile.ExtractToDirectory(String sourceArchiveFileName, String destinationDirectoryName, Encoding entryNameEncoding, Boolean overwrite)
at System.IO.Compression.ZipFile.ExtractToDirectory(String sourceArchiveFileName, String destinationDirectoryName)
at FunctionDataStore.PackageManagement.InstallPackage(String pkgFile, String pkgDir) in D:\Projects\Momo\UserPlatform\FunctionDataStore\PackageManagement.cs:line 250

暂时我可以回到1.1,但我需要转到2.0。

有谁知道可能导致此异常的原因以及我可以做些什么呢?

已添加:17年11月27日

我认为重启后我得到了答案。但现在问题仍然存在,无论我重启系统多少次。 .NET Core 2.0和System.IO.Compression.ZipFile存在一些问题。我已经确认在发生错误时没有其他进程实际使用提取的文件。

附录:17年11月207日

由于在ExtractToDirectory电话上显示SetLastWriteTime的堆栈跟踪失败,并且我并不真正关心文件的时间戳,因此我将ExtractToDirectory调用替换为以下内容:

using (ZipArchive archive = ZipFile.Open(pkgFile, ZipArchiveMode.Read))
{
    foreach (var entry in archive.Entries)
    {
        var filename = pkgDir + "\\" + entry.FullName;
        var fileDir = Path.GetDirectoryName(filename);
        Directory.CreateDirectory(fileDir);
        using (BinaryWriter writer = new BinaryWriter(File.Open(filename, FileMode.Create)))
        {
            byte[] bytes = new byte[1024];
            int numbytes;
            var stream = entry.Open();
            while ((numbytes = stream.Read(bytes, 0, 1024)) > 0)
            {
                writer.Write(bytes, 0, numbytes);
            }
        }
    }
}

其中pkgFile是要读取的zip文件,pkgDir是要提取的目录。这似乎没有问题。

尽管如此,我仍然不知道为什么SetLastWriteTimeExtractToDirectory失败了。但是这种解决方法似乎足以满足我的需求。

1 个答案:

答案 0 :(得分:0)

您可以找到正在使用您的文件的进程来查找错误根。查找哪个进程正在使用您的文件下载process explorer

  1. 运行流程资源管理器
  2. 按ctrl + f
  3. 文件的类型名称
  4. 这样您就可以使用文件找到并终止进程