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

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

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



답변

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로 마이그레이션 된 것 같습니다.



답변

.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”을 찾아 압축을 풉니 다.


답변

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 파일 내의 콘텐츠


답변

다음은 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());


답변

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


답변

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


답변