无法解压缩同一个文件两次?

时间:2017-11-27 12:01:32

标签: c# ionic-zip

我有一个“工作列表样式”应用程序,用户从列表中选择一个zip文件,然后单击一个按钮将其解压缩到本地文件夹。

以下是使用代码的摘录:

ZipFile zip = Ionic.Zip.ZipFile.Read(sourcePackage);
zip.ExtractAll(destination);
zip.Dispose();

第一次一切正常但是如果用户试图再次解压缩同一个文件(即使在解压缩其他几个文件之后),它会变得太快而且在目标文件夹中创建的所有内容都看起来像临时文件(例如'x2hiex0z.pj0')。

就好像Ionic.Zip.ZipFile.Read正在创建以前解压缩的文件名的缓存。

如果是这样,我如何清除它以便我可以强制它再次解压缩文件?

1 个答案:

答案 0 :(得分:0)

我猜你会得到一些"文件存在" -Exception

尝试:

OpenFileDialog open = new OpenFileDialog();
open.Filter = "zip Datei (.zip)|*.zip";
open.RestoreDirectory = true;

if (open.ShowDialog() == DialogResult.OK)
{
  try
  {
    ZipFile zip = Ionic.Zip.ZipFile.Read(open.FileName);
    zip.ExtractAll(".\\");
    zip.Dispose();
  }
  catch (ZipException zex)
  {
    MessageBox.Show(zex.Message);
  }
}

或使用主题:

private void open()
{
    OpenFileDialog open = new OpenFileDialog();
    open.Filter = "zip Datei (.zip)|*.zip";
    open.RestoreDirectory = true;

    if (open.ShowDialog() == DialogResult.OK)
    {

            Thread t1 = new Thread
            (delegate()
            {
                try
                {
                    using (ZipFile zip = Ionic.Zip.ZipFile.Read(open.FileName))
                    {
                        zip.ExtractProgress += zip_ExtractProgress;
                        zip.ExtractAll(".\\", ExtractExistingFileAction.OverwriteSilently);
                    }
                }
                catch (ZipException zex)
                {
                    error(zex.Message);
                }
             });
            t1.IsBackground = true;
            t1.Start();

    }
}


private void zip_ExtractProgress(object sender, ExtractProgressEventArgs args)
{
     update(args.TotalBytesToTransfer, args.BytesTransferred);
}



private void update(long ueTotal, long done)
{

    if (this.InvokeRequired)
    {
        this.Invoke(new MethodInvoker(() => { update(ueTotal, done); }));
    }
    else
    {
        if (ueTotal > 0)
        {
            double prz = (100d / ueTotal) * done;
            lblProz.Text = prz.ToString("###.##");
        }
    }
}