我试图创建一个过程,我使用SharpCompress解压缩一组rar文件,然后删除它们。
我首先有一个foreach循环,循环遍历要解压缩的不同文件集,如下所示:
foreach (var package in extractionPackages.Where(package => Extractor.ExtractToFolder(package, destinationFolder)))
{
FileHelper.DeleteExtractionFiles(package);
}
提取过程直接采用SharpCompress测试代码,如下所示:
public static bool ExtractToFolder(ExtractionPackage extractionPackage, string extractionPath)
{
var fullExtractionPath = Path.Combine(extractionPath, extractionPackage.FolderName);
try
{
using (var reader = RarReader.Open(extractionPackage.ExtractionFiles.Select(p => File.OpenRead(p.FullPath))))
{
while (reader.MoveToNextEntry())
{
reader.WriteEntryToDirectory(fullExtractionPath, ExtractOptions.ExtractFullPath | ExtractOptions.Overwrite);
}
}
return true;
}
catch (Exception)
{
return false;
}
}
正如您在第一个代码块中看到的那样,我然后调用删除文件,但由于文件被另一个进程锁定,我收到错误: 该进程无法访问文件'file.rar',因为它正在被其他进程使用。
如果我尝试在foreach循环之后删除,我可以删除除最后一组文件之外的所有文件,如果有多个文件。如果它只是一个相同的问题,因为最后一组文件似乎没有“解锁”。
如何构建代码以便解锁文件?
答案 0 :(得分:2)
通过使用Nunrar的一个例子并稍微修改它,我似乎终于解决了这个问题:
public static bool ExtractToFolder(ExtractionPackage extractionPackage, string extractionPath)
{
var fullExtractionPath = Path.Combine(extractionPath, extractionPackage.FolderName);
try
{
using (var reader = RarReader.Open(GetStreams(extractionPackage)))//extractionPackage.ExtractionFiles.Select(p => File.OpenRead(p.FullPath)), Options.None))
{
while (reader.MoveToNextEntry())
{
reader.WriteEntryToDirectory(fullExtractionPath, ExtractOptions.ExtractFullPath | ExtractOptions.Overwrite);
}
}
return true;
}
catch (Exception)
{
return false;
}
}
private static IEnumerable<Stream> GetStreams(ExtractionPackage package)
{
foreach (var item in package.ExtractionFiles)
{
using (Stream input = File.OpenRead(item.FullPath))
{
yield return input;
}
}
}
答案 1 :(得分:0)
默认情况下(可能是一个缺陷)是我让Streams打开,因为我自己没有创建它们。但是,.NET框架通常会使用StreamReader等内容破坏此规则,因此预计它们将被关闭。
我在想我会改变这种行为。在此期间,你应该能够通过调用它来解决这个问题:
RarReader.Open(extractionPackage.ExtractionFiles.Select(p => File.OpenRead(p.FullPath)), Options.None)
答案 2 :(得分:0)
我遇到了类似的麻烦。我使用SharpCompress在存档中添加文件,我需要在存档后删除文件。我曾尝试使用using(){}进行换行 - 但是这个解决方案在我的情况下并没有起作用。当我添加到我的代码Application.DoEvents()时 - 它解决了问题。