user1230268
user1230268

Reputation: 221

xamarin ionic zip unzip causes error

I have the following method to unzip a file after download. But it ends with an error

System.ArgumentException Path is empty at System.IO.Directory.CreateDirectory System.String path 0x00000 in file unknown at ionic.zip.zipentry.internalExtract system.string basedir system.io.stream outstream system.string password 0x00000 in filname unknown.

The zip file does not have a password and can be opened e.g. with android zip

public void ExtractBilderZip()
{
    string documentsPath = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal);
    string unzipziel = Path.Combine(documentsPath, "Bilder");

    // if Bilder does not exist create subdirectory
    if (Directory.Exists(unzipziel)==false)
    {
        var directoryname = Path.Combine(documentsPath, "Bilder");
        Directory.CreateDirectory(directoryname);

    }

    //////////////////////////////////////////////////////
    string zipToUnpack = localPathB;   //localPathB ist the zipFile name including path

    // I tried with and wihout the following 2 lines which makes no diffence
    zipToUnpack = zipToUnpack.Replace('/', Path.DirectorySeparatorChar);
    unzipziel = unzipziel.Replace('/', Path.DirectorySeparatorChar);

    try
    {
        ZipFile zip1 = ZipFile.Read(zipToUnpack);

        zip1.ExtractAll(unzipziel,ExtractExistingFileAction.OverwriteSilently);       
    }
    catch (System.Exception ex1)
    {
        //System.Console.Error.WriteLine("exception: " + ex1);
        for (int i = 0; i < 10; i++)
        {
            Toast.MakeText(this, "exception: " + ex1, ToastLength.Long).Show();
        }
    }
}

Upvotes: 2

Views: 1896

Answers (1)

user1230268
user1230268

Reputation: 221

I solved my problem by use of a Class called ZipStorer which I found by googleing. I found it here: zipstorer.codeplex.com It is tiny and very easy to use!!

FileInfo fi = new FileInfo(zipToUnpack);

FileStream inFile = fi.OpenRead();

// Get original file extension, 
// for example "doc" from report.doc.cmp.
string curFile = fi.FullName;
string origName = unzipziel;

try
{
    // Opens existing zip file
    ZipStorer zip = ZipStorer.Open(localPathB, FileAccess.Read);

    // Read all directory contents
    List<ZipStorer.ZipFileEntry> dir = zip.ReadCentralDir();

    // Extract all files in target directory
    string path;
    bool result;
    foreach (ZipStorer.ZipFileEntry entry in dir)
    {
        path = Path.Combine(unzipziel, Path.GetFileName(entry.FilenameInZip));
        result = zip.ExtractFile(entry, path);

        RunOnUiThread(() =>
        {
            Button buttonUZ = FindViewById<Button>(Resource.Id.btnUnzip);
            buttonUZ.Text = "Entpacke: " + entry.FilenameInZip;

        });
    }
    zip.Close();

    File.Delete(@localPathB);
}
catch (Exception ex1)
{
    var errorActivity = new Intent(this, typeof(ErrorActivity));
    errorActivity.PutExtra("ERROR", ex1.ToString());

    StartActivity(errorActivity);
}

Upvotes: 1

Related Questions