2010-01-11 2 views
0

ICSharpCode.SharpZipLib 및 DotNetZip을 다운로드했습니다. 나는 meg를 4 megs로 변화시키면서 한 번에 100 개가 넘는 파일들을 압축하고있다. ICSharpCode를 사용할 때 'ContextSwitchDeadlock'오류가 발생합니다. DotNetZip은 파일을 매번 종료하지 못합니다.수많은 파일을 압축하는 라이브러리 또는 도구가 있습니까?

또한, 나는 셰어 폴더에서 일하고 있어요

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); 
// } 
+0

DotNetZip 용 코드와 예외 사항을 표시하면 도움을 드리겠습니다. 그것은 100,000 이상의 파일, 10 기가 바이트 또는 그 이상으로 잘 작동합니다. – Cheeso

답변

0

당신은 예외를 제공하지 않았다 (내 로컬 드라이브 매핑). DotNetZip을 사용할 때, 이 공유 지점 드라이브와 매핑 될 수 있습니다. DotNetZip은 일반적으로 zip을 임시 파일로 저장 한 다음 이름을 바꿉니다. 어쩌면 이것은 셰어 때문에 작동하지 않을 수도 있습니다. 이 경우 파일 스트림을 열어 해당 스트림에 저장해보십시오. 이렇게하면 이름 바꾸기 작업이 수행되지 않습니다.

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); 
    } 
} 
+0

나는 그것에게 시험을 줄 것이다. –

관련 문제