首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ZipFile.ExtractToDirectory在.Net-Core 2.0上失败

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

Stack Overflow用户
提问于 2017-10-03 23:44:02
回答 1查看 1.1K关注 0票数 0

我有一个.NET Core项目,它在1.1上运行得很好,但是现在在2.0上失败了。当我试图用ZipFile.ExtractToDirectory解压缩压缩存档(从System.IO.Compression)时,问题就会发生。我得到一两个文件,但随后它抛出了一个异常消息:

代码语言:javascript
复制
The process cannot access the file '<path to file>' because it is being used by another process.

据我所知,没有其他进程可以像刚刚提取的那样使用该文件。当我得到错误时,它实际上出现在磁盘上。

堆栈跟踪是:

代码语言:javascript
复制
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。

有人知道是什么导致了这一异常吗?我能做些什么?

添加:11月27日至17日

我以为我在重启后找到了答案。但是现在问题依然存在,不管我重启了多少次系统。.NET Core2.0和System.IO.Compression.ZipFile存在一些问题。我已经证实,当错误发生时,没有其他进程实际使用提取的文件。

增编:207年11月17日

由于堆栈跟踪显示ExtractToDirectorySetLastWriteTime调用上失败,而且我并不真正关心文件上的时间戳,所以我用以下方法替换了ExtractToDirectory调用:

代码语言:javascript
复制
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上失败了。但这种解决办法似乎足以满足我的需要。

EN

回答 1

Stack Overflow用户

发布于 2017-10-04 05:19:42

您可以找到使用您的文件查找错误根的进程。要查找正在使用文件的进程,请下载过程资源管理器

  1. 运行进程资源管理器
  2. 按ctrl+f
  3. 键入文件名
  4. 这样,您就可以使用您的文件找到并终止进程。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46555027

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档