Не можете распаковать один и тот же файл дважды?

У меня есть приложение "стиль рабочего списка", где пользователь выбирает zip-файл из списка, а затем нажимает кнопку, чтобы распаковать его в локальную папку.

Вот выдержка из используемого кода:

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

В первый раз все работает нормально, но если пользователь пытается разархивировать тот же файл снова (даже после разархивирования нескольких других), он идет слишком быстро, и все, что создается в папке назначения, выглядит как временный файл (например, 'x2hiex0z).pj0').

Как будто Ionic.Zip.ZipFile.Read создает кэш ранее разархивированных имен файлов.

Если так, как я могу очистить это, чтобы я мог заставить это разархивировать файл снова?

1 ответ

Я догадываюсь, вы получаете какое-то исключение "File Exist"

Пытаться:

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("###.##");
        }
    }
}
Другие вопросы по тегам