首页 文章

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

提问于
浏览
0

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

以下是使用的代码摘录:

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

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

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

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

1 回答

  • 0

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

    尝试:

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

相关问题