Lamloumi Afif
Lamloumi Afif

Reputation: 9081

Deletion of compressed file after extracting it with nunrar

I used the lib Nunrar site to extract a .rar file:

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

the decompression works fine, but I can't after this operation of extract delete the original compressed file

System.IO.File.Delete(path);

because the file is is used by another process the hole function :

 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 { }

So can I delete the compressed file after extract it?

Upvotes: 0

Views: 1438

Answers (2)

DarkPh03n1X
DarkPh03n1X

Reputation: 680

I also had this issue with nunrar, nether close() or a using statement seem to fix this. unfortunately the Documentation is scarce, so im now using the SharpCompress library it is a fork of the nunrar library according to the devs of nunrar.The documentation on SharpCompress is also scarce (but less) so here is my method im using:

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;
}

Add the following libraries to the top

using SharpCompress.Common;
using SharpCompress.Readers;

Install using nuget.This method works for SharpCompress v0.22.0(latest at the time of writing)

Upvotes: 0

keyboardP
keyboardP

Reputation: 69372

I don't know what zf is but you can also likely wrap that in a using statement. Try replacing your FileStream fs part with this

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

This way fs is closed even if path doesn't contain .rar. You're only closing the fs if rar exists within the filename.

Also, does the library have its own stream handling? It could have a method that closes it.

Upvotes: 1

Related Questions