使用nunrar解压缩后删除压缩文件

时间:2013-07-04 10:28:09

标签: c# .net io delete-file

我使用了lib Nunrar site来提取.rar文件:

RarArchive.WriteToDirectory(fs.Name, Path.Combine(@"D:\DataDownloadCenter", path2), ExtractOptions.Overwrite);

解压缩工作正常,但我不能在此操作后解压缩删除原始压缩文件

System.IO.File.Delete(path);

因为文件被另一个进程使用 洞功能:

 try
           {
               FileStream fs = File.OpenRead(path);
               if(path.Contains(".rar")){

                   try
                   {
                       RarArchive.WriteToDirectory(fs.Name, Path.Combine(@"D:\DataDownloadCenter", path2), ExtractOptions.Overwrite);
                       fs.Close();

                   }
                   catch { }

                   }

           catch { return; }
           finally
           {
               if (zf != null)
               {
                   zf.IsStreamOwner = true; // Makes close also shut the underlying stream
                   zf.Close(); // Ensure we release resources
               }
           }
           try
           {
               System.IO.File.Delete(path);
           }
           catch { }

我可以在解压缩后删除压缩文件吗?

2 个答案:

答案 0 :(得分:1)

我不知道zf是什么,但您也可以将其包含在using语句中。尝试用此

替换FileStream fs部分
using( FileStream fs = File.OpenRead(path))
{
    if(path.Contains(".rar"))
    {
        try
        {
           RarArchive.WriteToDirectory(fs.Name, Path.Combine(@"D:\DataDownloadCenter", path2), ExtractOptions.Overwrite);
        }
        catch { }
     }
}

即使fs不包含path,这种方式.rar也会关闭。如果文件名中存在fs,则只关闭rar

此外,库是否有自己的流处理?它可以有一个关闭它的方法。

答案 1 :(得分:0)

我在nunrar,nether close()或using语句中也遇到了这个问题,似乎可以解决此问题。 不幸的是,文档很稀少,所以现在使用SharpCompress library是nunrar库according to the devs of nunrar的分支。SharpCompress上的文档也很稀少(但是更少),所以这是我使用的方法:< / p>

private static bool unrar(string filename)
{
    bool error = false;
    string outputpath = Path.GetDirectoryName(filename);

    try
    {
        using (Stream stream = File.OpenRead(filename))
        {
            var reader = ReaderFactory.Open(stream);
            while (reader.MoveToNextEntry())
            {
                if (!reader.Entry.IsDirectory)
                {
                    Console.WriteLine(reader.Entry.Key);
                    reader.WriteEntryToDirectory(outputpath, new ExtractionOptions() { ExtractFullPath = true, Overwrite = true });
                }
            }
        }
    }
    catch (Exception e)
    {
        Console.WriteLine("Failed: " + e.Message);
        error = true;
    }

    if (!error)
    {
        File.Delete(filename);
    }
    return error;
}

将以下库添加到顶部

using SharpCompress.Common;
using SharpCompress.Readers;

使用nuget安装。此方法适用于SharpCompress v0.22.0(撰写本文时为最新版本)