2017-01-26 1 views
0

zip 파일이 있으면 지정한 압축 수준 (예 : 압축 없음)으로 다시 만들어야합니다.다른 zip 파일에서 zip 파일 다시 만들기

나는 거의 다 해요,하지만 오류 얻을 : 나는 창문에 다시 zip 파일을 저장하는 경우가 올바른지처럼

Failed: Number of entries expected in End Of Central Directory does not correspond to number of entries in Central Directory.

, 보이는 (정확한 파일 크기, 항목 모두 올바른 파일 크기로 존재) 파일은 추출 할 수 없습니다. 내가 할 경우 함수의 끝에

public static byte[] ReCompress(byte[] originalArchive, CompressionLevel newCompressionLevel) 
{ 
    var entries = new Dictionary<string, byte[]>(); 

    /////////////////////////// 
    // STEP 1: EXTRACT ALL FILES 
    /////////////////////////// 
    using (var ms = new MemoryStream(originalArchive)) 
    using (var originalZip = new ZipArchive(ms, ZipArchiveMode.Read)) 
    { 
     foreach (var entry in originalZip.Entries) 
     { 
      var isFolder = entry.FullName.EndsWith("/"); 
      if (!isFolder) 
      { 
       using (var stream = entry.Open()) 
       using (var entryMS = new MemoryStream()) 
       { 
        stream.CopyTo(entryMS); 
        entries.Add(entry.FullName, entryMS.ToArray()); 
       } 

      } 
      else 
      { 
       entries.Add(entry.FullName, new byte[0]); 
      } 
     } 
    } 

    /////////////////////////// 
    // STEP 2: BUILD ZIP FILE 
    /////////////////////////// 
    using (var ms = new MemoryStream()) 
    using (var newArchive = new ZipArchive(ms, ZipArchiveMode.Create, true)) 
    { 
     foreach (var uncompressedEntry in entries) 
     { 
      var newEntry = newArchive.CreateEntry(uncompressedEntry.Key, newCompressionLevel); 
      using (var entryStream = newEntry.Open()) 
      using (var writer = new BinaryWriter(entryStream, Encoding.UTF8)) 
      { 
       writer.Write(uncompressedEntry.Value); 
      } 
     } 
     return ms.ToArray(); 
    } 
} 

: 그것은 제대로 구조 아카이브를 생성

File.WriteAllBytes(@"D:\test.zip", ms.ToArray()); 

90mb 크기 있지만 파일이 추출되지 않습니다.

return ms.ToArray()으로 끝나면 ~130kb 바이트 배열을 반환합니다.

+0

그럼 먼 길 주변에 임시 위치로 첫 번째 아카이브를 추출하고 새로운 아카이브로 다시 압축하는 것입니다. – Nkosi

답변

1

완료되기 전에 내용을 MemoryStream에서 읽음으로써 Zip 아카이브가 손상되었습니다. 보관 파일 생성을 완료하려면 ms.ToArray()으로 전화하기 전에 newArchive.Dispose()으로 전화해야합니다. 이 특별한 경우에 당신은 이런 식으로 작업을 수행 할 수 있습니다

using (var ms = new MemoryStream()) 
{ 
    using (var newArchive = new ZipArchive(ms, ZipArchiveMode.Create, true)) 
    { 
     foreach (var uncompressedEntry in entries) 
     { 
      var newEntry = newArchive.CreateEntry(uncompressedEntry.Key, newCompressionLevel); 
      using (var entryStream = newEntry.Open()) 
      using (var writer = new BinaryWriter(entryStream, Encoding.UTF8)) 
      { 
       writer.Write(uncompressedEntry.Value); 
      } 
     } 
    } 

    return ms.ToArray(); 
} 
+0

감사합니다. –