Есть ли библиотека или инструмент для архивирования многочисленных файлов - PullRequest
0 голосов
/ 11 января 2010

Я скачал ICSharpCode.SharpZipLib и DotNetZip. Я архивирую более 100 файлов за раз, варьируясь от мег до 4 мегабайт. Когда я использую ICSharpCode, я получаю ошибку «ContextSwitchDeadlock». DotNetZip каждый раз завершает работу с файлом.

Кроме того, я работаю над папками sharepoint (привязанными к моему локальному диску)

private bool zipall()
//ICSharpCode
{
    int i = 0;
    progressBarzipping.Minimum = 0;
    progressBarzipping.Maximum = listBoxfiles.Items.Count;
    ZipOutputStream zipOut = new ZipOutputStream(File.Create(textBoxDropPath.Text + "\\" + textBoxZipFileName.Text + ".zip"));
    foreach (string fName in listBoxfiles.Items)
    {
        try
        {
            FileInfo fi = new FileInfo(fName);
            ZipEntry entry = new ZipEntry(fi.Name);
            FileStream sReader = File.OpenRead(fName);
            byte[] buff = new byte[Convert.ToInt32(sReader.Length)];
            sReader.Read(buff, 0, (int)sReader.Length);
            entry.DateTime = fi.LastWriteTime;
            entry.Size = sReader.Length;
            sReader.Close();
            zipOut.PutNextEntry(entry);
            zipOut.Write(buff, 0, buff.Length);
        }
        catch
        {
            MessageBox.Show("Zip Failed");
            zipOut.Finish();
            zipOut.Close();
            progressBarzipping.Value = 0;
            return false;
        }
        i++;
        progressBarzipping.Value = i;
    }
    zipOut.Finish();
    zipOut.Close();
    MessageBox.Show("Zip Complete");
    progressBarzipping.Value = 0;
    return true;

}

//Not sure but I think this was my DotNetZip approach
//using (ZipFile zip = new ZipFile())
//  {
//     foreach(string file in listboxFiles.Items)
//       {
//         zip.AddFile(file);
//       }      
//  zip.Save(PathToNewZip);
//  }

1 Ответ

0 голосов
/ 11 января 2010

Вы не предоставили исключение. Я полагаю, что при использовании DotNetZip проблема может быть с подключенным диском sharepoint. DotNetZip обычно сохраняет zip как временный файл, а затем переименовывает его. Может быть, это не работает из-за sharepoint. Если это так, попробуйте открыть файловый поток и сохранить его в этом потоке. Это позволяет избежать операции переименования.

progressBarzipping.Minimum = 0; 
progressBarzipping.Maximum = listBoxfiles.Items.Count;
using (Stream fs = new FileStream(PathToNewZip, FileMode.Create, FileAccess.Write))
{
    using (ZipFile zip = new ZipFile()) 
    { 
       zip.AddFiles(listboxFiles.Items);

       // do the progress bar: 
       zip.SaveProgress += (sender, e) => {
          if (e.EventType == ZipProgressEventType.Saving_BeforeWriteEntry) {
             progressBarzipping.PerformStep();
          }
       };

       zip.Save(fs); 
    }
} 
...