Sevenzipsharp 文件锁。我不能移动文件?

Posted

技术标签:

【中文标题】Sevenzipsharp 文件锁。我不能移动文件?【英文标题】:sevenzipsharp file lock. I can't move a file? 【发布时间】:2012-01-11 20:42:29 【问题描述】:

我正在对各种存档运行 Sevenzipsharp,如果它通过了我的测试,我想将存档移动到另一个文件夹中。但是我得到一个异常,说该文件正在被进程使用。我也不能在 Windows 资源管理器中移动它,但是当我终止我的应用程序进程时,我可以移动它。我怀疑sevenzipsharp 锁定了文件,所以我无法移动它。

我写using (var extractor= new SevenZipExtractor(fn)) 。我尝试将文件移到 using 块之外,但仍然不行。似乎在我运行此方法几次后,我可以移动第一个存档,但我将无法移动最后一个存档

我该如何做才能使没有进程使用该文件,以便我可以将存档移动到文件夹中?

【问题讨论】:

这就是开源的好处,你可以自己修复错误。如果您希望作者这样做,请使用项目的问题跟踪器。我怀疑他会想要一个复制项目,一个相当合理的期望。 【参考方案1】:

我可以使用以下代码完成这项工作(即使存档无效):

try 

    extractor.ExtractArchive(tempFolder);

finally

    extractor.Dispose();
    GC.Collect();
    GC.WaitForPendingFinalizers();
    Directory.Delete(tempFolder, true);

【讨论】:

我并不喜欢这个解决方案,因为 GC.Collect() 不是一种昂贵的方法,因为它适用于整个 .NET 运行时?但是,这是一种有效的解决方法。在archive.codeplex.com/?p=sevenzipsharp 记录了一个问题(请参阅“未正确处理,留下文件在使用中。”)作者说他会在 2009 年修复它,而项目 #3743 已于 2013 年关闭,但我抓住了今年的发行版,它仍然有问题。我正在使用从 NuGet 获得的 SevenZipSharp.dll v0.64.3890.29348。【参考方案2】:

只需 dispose() 这个对象,不要使用 using(....) 我不知道为什么(!)但是这个方法对我有用。

但如果存档无效,它将保持锁定状态... 有什么建议吗?

更新: 有一个更好的办法。您可以为您的文件创建一个 Stream 并在代码末尾关闭()它。

Stream reader=new FileStream(filename, FileMode.Open);//You can change Open mode to OpenOrCreate
sevenZipExtractor extactor= new SevenZipExtractor((Stream)reader);

//Your code here.....

reader.Close();
extactor.Dispose();

【讨论】:

以上是关于Sevenzipsharp 文件锁。我不能移动文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 SevenZipSharp 提取多卷 7z 文件?

如何使用 SevenZipSharp 创建压缩的 SFX 文件?

SevenZipSharp - 压缩内存流

SevenZipSharp 在提取时显示当前提取文件

SevenZipSharp - 如何使用 c# 将多个目录压缩成一个文件?

使用 SevenZipSharp 压缩多卷?