【问题标题】:Cannot unzip same file twice?同一个文件不能解压两次?
【发布时间】:2018-05-10 16:02:37
【问题描述】:

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

以下是所用代码的摘录:

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

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

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

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

【问题讨论】:

  • 附带说明,当您的某些代码涉及IDisposable(如ZipFile)时,最好使用using 子句。 (并且当到达 using 块的末尾时,它会自动为您调用 Dispose())
  • 另外,如果您调试您的应用程序,是否会引发任何异常,如以下答案中所建议的那样?如果是,请提供错误信息。
  • 我得到一个异常“这个操作已经调用了 OperationCompleted 并且进一步的调用是非法的。”。所以我只需要清除缓存的内容吗?
  • sourcePackage 是流吗?如果是这样,您是否每次都打开和关闭流?如果没有,您可能需要倒带。
  • 没有流,只有文件名。 sourcePackage = 'c:\path-to-the.zip'

标签: c# ionic-zip


【解决方案1】:

我猜你会得到某种“文件存在”-异常

试试:

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("###.##");
        }
    }
}

【讨论】:

  • OperationCompleted 听起来像 BackgroundWorker,请在您的异步内容中发布更多代码。
  • 我相信 IonicZip 库是异步的。我正在使用 zip.ExtractProgress 来跟踪进度。好像库在记住它已经完成了我想重新解压的zip文件的解压操作。
  • 尝试:zip.ExtractAll(".\\", ExtractExistingFileAction.OverwriteSilently);
  • 我只是尝试了 Flocke 的建议,但遗憾的是没有改变。
猜你喜欢
  • 1970-01-01
  • 2019-01-06
  • 2015-08-04
  • 2014-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-09
  • 1970-01-01
相关资源
最近更新 更多