전체 파일의 압축을 풀지 않고 zip 파일에서 데이터를 읽는 방법


97

어쨌든 전체 파일의 압축을 풀지 않고 zip 파일에서 데이터를 추출하는 .Net (C #)이 있습니까?

단순히 zip 파일의 시작 부분에서 데이터 (파일)를 추출하고 싶을 수도 있습니다. 압축 알고리즘이 파일을 결정적인 순서로 압축하는지 여부는 분명히 다릅니다.


답변:


78

DotNetZip 은 여러분의 친구입니다.

다음과 같이 쉽습니다.

using (ZipFile zip = ZipFile.Read(ExistingZipFile))
{
  ZipEntry e = zip["MyReport.doc"];
  e.Extract(OutputStream);
}

(파일이나 다른 대상으로 추출 할 수도 있습니다).

zip 파일의 목차를 읽는 것은 다음과 같이 쉽습니다.

using (ZipFile zip = ZipFile.Read(ExistingZipFile))
{
  foreach (ZipEntry e in zip)
  {
    if (header)
    {
      System.Console.WriteLine("Zipfile: {0}", zip.Name);
      if ((zip.Comment != null) && (zip.Comment != "")) 
        System.Console.WriteLine("Comment: {0}", zip.Comment);
      System.Console.WriteLine("\n{1,-22} {2,8}  {3,5}   {4,8}  {5,3} {0}",
                               "Filename", "Modified", "Size", "Ratio", "Packed", "pw?");
      System.Console.WriteLine(new System.String('-', 72));
      header = false;
    }
    System.Console.WriteLine("{1,-22} {2,8} {3,5:F0}%   {4,8}  {5,3} {0}",
                             e.FileName,
                             e.LastModified.ToString("yyyy-MM-dd HH:mm:ss"),
                             e.UncompressedSize,
                             e.CompressionRatio,
                             e.CompressedSize,
                             (e.UsesEncryption) ? "Y" : "N");

  }
}

참고 사항 : Codeplex에서 살던 DotNetZip. Codeplex가 종료되었습니다. 이전 아카이브는 Codeplex에서 계속 사용할 수 있습니다 . 코드가 Github로 마이그레이션 된 것 같습니다.



9
+1. 이면에서 DotNetZip이 생성자에서 수행하는 작업은 zip 파일 내부의 "디렉토리"를 찾은 다음이를 읽고 항목 목록을 채우는 것입니다. 이 시점에서 앱이 한 항목에 대해 Extract ()를 호출하면 DotNetZip은 zip 파일의 적절한 위치를 찾고 해당 항목에 대한 데이터의 압축을 해제합니다.
Cheeso

115

.Net Framework 4.5 ( ZipArchive 사용 ) :

using (ZipArchive zip = ZipFile.Open(zipfile, ZipArchiveMode.Read))
    foreach (ZipArchiveEntry entry in zip.Entries)
        if(entry.Name == "myfile")
            entry.ExtractToFile("myfile");

zipfile에서 "myfile"을 찾아 압축을 풉니 다.


35
또한 entry.Open ()을 사용하여 스트림을 가져올 수 있습니다 (내용을 읽어야하지만 파일에 쓰지 않는 경우).
anre apr

17
참조 : System.IO.Compression.dllSystem.IO.Compression.FileSystem.dll
yzorg

18

SharpZipLib을 사용하려는 경우 다음과 같이 파일을 하나씩 나열하고 추출합니다.

var zip = new ZipInputStream(File.OpenRead(@"C:\Users\Javi\Desktop\myzip.zip"));
var filestream = new FileStream(@"C:\Users\Javi\Desktop\myzip.zip", FileMode.Open, FileAccess.Read);
ZipFile zipfile = new ZipFile(filestream);
ZipEntry item;
while ((item = zip.GetNextEntry()) != null)
{
     Console.WriteLine(item.Name);
     using (StreamReader s = new StreamReader(zipfile.GetInputStream(item)))
     {
      // stream with the file
          Console.WriteLine(s.ReadToEnd());
     }
 }

이 예를 기반으로 : zip 파일 내의 콘텐츠


1
솔직히 말해서이 링크가 질문에 어떻게 답하는지 볼 수 없었습니다.
Eugene Mayevski '콜백

10

다음은 UTF8 텍스트 파일을 zip 아카이브에서 문자열 변수 (.NET Framework 4.5 이상)로 읽는 방법입니다.

string zipFileFullPath = "{{TypeYourZipFileFullPathHere}}";
string targetFileName = "{{TypeYourTargetFileNameHere}}";
string text = new string(
            (new System.IO.StreamReader(
             System.IO.Compression.ZipFile.OpenRead(zipFileFullPath)
             .Entries.Where(x => x.Name.Equals(targetFileName,
                                          StringComparison.InvariantCulture))
             .FirstOrDefault()
             .Open(), Encoding.UTF8)
             .ReadToEnd())
             .ToArray());

0

Zip 파일에는 목차가 있습니다. 모든 zip 유틸리티에는 TOC 만 쿼리 할 수있는 기능이 있어야합니다. 또는 7zip -t와 같은 명령 줄 프로그램을 사용하여 목차를 인쇄하고 텍스트 파일로 리디렉션 할 수 있습니다.


0

이 경우 zip 로컬 헤더 항목을 구문 분석해야합니다. zip 파일에 저장된 각 파일에는 (일반적으로) 압축 해제를위한 충분한 정보가 포함 된 이전 로컬 파일 헤더 항목이 있습니다. 파일을 열고 해당 부분에 대해 unzip을 호출합니다 (전체 Zip 압축 해제 코드 또는 라이브러리를 처리하지 않으려는 경우).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.