我有一个.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
是要提取的目录。这似乎没有问题。
尽管如此,我仍然不知道为什么SetLastWriteTime
在ExtractToDirectory
失败了。但是这种解决方法似乎足以满足我的需求。
答案 0 :(得分:0)
您可以找到正在使用您的文件的进程来查找错误根。查找哪个进程正在使用您的文件下载process explorer