2011-01-25 2 views
4

인사말 ....DotNetZip에있는 파일의 대용량 압축 문제가 있습니다.

저는 최신 DotNetZip을 사용하여 C# 3.5의 백업 프로그램을 작성하고 있습니다. 프로그램의 기본 사항은 서버의 위치와 스팬 된 zip 파일의 최대 크기를 지정하고 이동하는 것입니다. 거기서 주어진 위치에서 모든 폴더/파일을 가로 지르고 정확한 구조를 유지하면서 아카이브에 추가해야합니다. 또한 모든 것을 합리적인 수준으로 압축해야합니다. 주어진 압축되지 않은 폴더/파일 모음은 쉽게 10-25GB가 될 수 있으며 작성된 스팬 파일은 각각 약 1GB로 제한됩니다.

나는 (DotNetZip을 사용하여) 모든 작업을 수행했습니다. 나의 유일한 도전은 실제적으로 일어나지 않는 약간의 경쟁이 있다는 것입니다. 나는 코드의 단순성을 위해 "AddDirectory"메서드를 사용하고 일반적으로 내 프로젝트에 얼마나 잘 맞는 것처럼 보였습니다. 주위를 읽은 후 나는 그 결정을 추측합니다.

  1. 아래 코드와 많은 양의 파일이 아카이브에 있으면 각 파일이 압축 된대로 압축해야합니까? 또는 Adddirectory 메서드가 동일한 압축을 제공해야합니까?

  2. Ionic.Zlib.CompressionLevel에서 제공하는 모든 수준의 압축을 시도했지만 아무 것도 도움이되지 않습니다. 외부 압축 알고리즘을 사용하여 DotNetZip 파일로 스트리밍하는 방법에 대해 생각해야합니까?

    using (ZipFile zip = new ZipFile()) 
    { 
        zip.AddDirectory(root.FullName); 
    
        if (zipPassword.Length > 0) 
        zip.Password = zipPassword; 
    
        float size = zipGbSize * 1024 * 1024 * 1024; 
    
        zip.CompressionLevel = Ionic.Zlib.CompressionLevel.BestCompression; 
        zip.AddProgress += new EventHandler<AddProgressEventArgs>(Zip_AddProgress); 
        zip.ZipError += new EventHandler<ZipErrorEventArgs>(Zip_ZipError); 
        zip.Comment = "This zip was created at " + System.DateTime.Now.ToString("G"); 
        zip.MaxOutputSegmentSize = (int)size; //in gig 
        zip.Name = archiveDir.FullName + @"\Task_" + taskId.ToString() + ".zip"; 
        zip.Save(); 
    } 
    

어떤 도움 주셔서 감사합니다!

답변

2

1. 아래 코드와 많은 양의 파일이 아카이브에 있으면 zip에 추가 될 때 각 파일을 압축해야합니까?

DotNetZip의 작동 방식은 각 파일이 압축 파일에 추가 될 때마다 압축하는 것입니다. 앱을 압축 할 필요가 없습니다. DotNetZip이이 작업을 수행합니다.

또는 Adddirectory 메서드가 거의 동일한 압축을 제공해야합니까?

AddDirectory() 메소드를 통해 zip 파일에 추가 된 항목은 zip 아카이브가 작성 될 때 AddFile()을 통해 추가 된 항목과 동일한 코드 경로를 거칩니다. 파일 데이터는 압축 된 다음 선택적으로 암호화 된 다음 zip 파일에 기록됩니다.


원치 않는 팁 : 당신은 할 필요가 없습니다 :

zip.AddProgress += new EventHandler<AddProgressEventArgs>(Zip_AddProgress); 

당신은 다만 할 수 있습니다

zip.AddProgress += Zip_AddProgress; 

어떻게 더 압축이 발생되지 않도록 결정된다 ?

각 항목의 압축에 대해 궁금한 경우 SaveProgress 이벤트 처리기를 등록 할 수 있습니다. SaveProgress 이벤트는 저장이 시작될 때, DotNetZip이 한 항목의 데이터 쓰기를 시작할 때, 한 항목을 쓰는 동안 다양한 간격으로, 각 항목의 데이터 쓰기를 마친 후를 포함하여 아카이브 작성 중에 여러 번 발생합니다. 모든 데이터 쓰기를 마치면 이 단계는 the ZipProgressEventType enumeration에 설명되어 있습니다. EventType이 Saving_AfterWriteEntry이면 해당 항목의 압축 비율을 계산할 수 있습니다.

압축이 발생하지 않는지 확인하려면 해당 SaveProgress 이벤트를 등록하고 해당 압축 비율을 확인하는 것이 좋습니다.

또한 위에서 설명한 것처럼 일부 파일 형식은 압축 할 수 없습니다. JPG, MPG, MP3, ZIP 파일 등은 압축률이 높지 않습니다.


마지막으로 DotNetZip 명령 줄 도구를 사용하면 백업 작업을 훨씬 쉽게 수행 할 수 있습니다. 특정 디렉토리 만 백업하려는 경우 명령 줄 도구 (zipit.exe)를 사용하여 프로그램 작성을 피할 수 있습니다. zipit.exe 도구를 사용하면 -v 옵션을 사용하면 도구가 진행률 보고서를 인쇄하고 위에서 설명한 메커니즘을 통해 각 항목의 압축을 표시합니다. 사용자가 직접 프로그램을 작성하는 것을 선호하더라도 zipit.exe를 사용하여 DotNetZip을 사용할 때 압축 여부를 확인할 수 있습니다.

+0

Cheeso에 응답 해 주셔서 감사합니다. 그것은 내가 필요로하는 definatly 정보이었다. 내가 압축을하지 않는다는 이유는 원래 파일 세트와 압축 파일 세트가 거의 같은 크기이기 때문입니다. 나는 압축 파일, 이미지, 음악 파일이 거의 없다는 것을 확인했습니다. 귀하의 권장 사항을 시도하고 SaveProgress 이벤트를 모니터링하여 적어도 평균 압축을 얻습니다. 다시 의견에 감사드립니다. – David

2

질문을 줄이지는 않았지만 모든 zip 파일의 최대 크기는 its 4Gb입니다. 그 한계에 도달 할 때마다 새로운 ZipFile을 만들어야 할 수도 있습니다.

죄송합니다. 도움이되지 않으면 죄송합니다.

+0

제한 (z01, z02, z03 ....)으로 인해 zip 파일이 분할됩니다. 각 분할은 약 1GB 인 "부모"지퍼와 함께 1GB입니다. – David

1

어떤 종류의 데이터를 압축하고 있습니까? 어떤 종류의 데이터는 이미 압축되어 있지 않습니다 (예 : JPEG 또는 이미 압축 된 ZIP 파일).

+1

모든 평균 파일이 엉망입니다. 문서, 사진, 다운로드, pdf 등 회사의 모든 사람들이 서버에 공유 드라이브를 가지고 있습니다. 나는 서버에있는 모든 파일을 백업하고 싶다. – David

+2

docx, xlsx 파일 등은 또한 zip 파일입니다. 대부분의 그림 형식은 압축되어 있습니다. 내 생각에 대부분의 소스 파일은 압축 할 수 없다. – phoog