zip 파일을 읽고 쓰기 위해 System.io.compression을 사용하는 방법?

StackOverflow https://stackoverflow.com/questions/184309

  •  06-07-2019
  •  | 
  •  

문제

나는 있다는 것을 알고있다 zip 파일로 작업하기위한 라이브러리. 그리고 당신은 대안 적으로 할 수 있습니다 zip 파일을 작동시키기 위해 Windows에 내장 기능을 사용하십시오..

그러나 ZIP 파일을 읽고/쓰기 위해 .NET 내에있는 system.io.compression 네임 스페이스에 내장 된 도구를 사용하는 방법을 해결했는지 궁금합니다. 아니면이 네임 스페이스 만 사용할 수 없습니까?

업데이트 : System.io.packaging 네임 스페이스가 유용 할 수 있다고 누군가에게 언급 한 것 같습니다. 누구든지 정확히 어떻게하는지 아는 사람이 있습니까?

도움이 되었습니까?

해결책

MSDN은 완전합니다 예시 http://msdn.microsoft.com/en-us/library/system.io.packaging.zippackage.aspx zippackage 클래스 사용. .NET 3.5가 필요합니다.

다른 팁

데이브, 아주 좋은 !! 나는 그것이 거기에 있다는 것을 몰랐다.

무엇을 찾아야하는지 알았으므로 사용 방법에 대한 작은 코드 샘플이있는 기사를 찾을 수있었습니다.http://weblogs.asp.net/jgalloway/archive/2007/10/25/creating-zip-archives-in-net-without-an-external-library-like-sharpziplib.aspx

관련 메모에서 나는 또한 발견했다 dotnetzip 프로젝트 사용하기가 매우 쉽습니다.

당신은 다음과 같은 타사 라이브러리를 사용하고 싶을 것입니다. http://www.codeplex.com/dotnetzip, zip 파일을 읽기 위해 gzipstream 또는 deflatestream을 사용하려고 시도하는 대신.

.NET의 *** 스트림 클래스를 사용하면 압축 된 바이트 스트림을 읽거나 쓸 수 있습니다. 이 클래스는 zip 파일을 읽거나 쓰지 않습니다. ZIP 파일은 "엔벨로프"또는 헤더로 둘러싸인 압축 데이터입니다. 메타 데이터로 생각하십시오 - 파일의 이름, 타임 스탬프, CRC 및 기타 여러 가지가 포함됩니다. ** 스트림 클래스는 압축 된 데이터 스트림 만 생성하며 메타 데이터를 생성하거나 소비하는 방법을 모르며, 이는 PKWare가 관리하는 PKZIP 형식 사양으로 설명됩니다.

DotnetZip과 같은 타사 라이브러리는 지퍼 아카이브의 메타 데이터를 처리합니다. 그들은 system.io.compression.deflatestream () 클래스를 사용하여 압축 된 바이트 스트림을 생성 할 수 있습니다. 예를 들어 이전 릴리스에서 Dotnetzip은 내장 Deflatestream을 사용했습니다. v1.7 기준으로 DotNetzip에는 자체 Deflatestream이 포함되어 있으며 .NET 프레임 워크에서 배송 된 것보다 더 효율적입니다. 추가 혜택으로 DotnetZip의 내장 된 deflatestream을 사용하면 dotnetzip이 .NET Compact Framework 2.0에서 사용할 수 있습니다. (Compact Framework 3.5에 추가되었습니다)

더 많은 질문이 있다면 Dotnetzip 사이트에 좋은 포럼이 있습니다. 예제 C# 코드 :

    try
    {
        using (ZipFile zip = new ZipFile())
        {
            zip.AddDirectory(DirectoryToZip); // recurses subdirs
            zip.Save(Filename);
        }
    }
    catch (System.Exception ex1)
    {
        System.Console.Error.WriteLine("exception: " + ex1);
    }

.NET 4.5 이후 Microsoft는 다음을 제안했습니다 ziparchive 수업 System.IO.Compression 네임 스페이스. 그러나 그 네임 스페이스의 다른 클래스와 달리 GZipStream 그리고 Deflate 스트림, ZipArchive System.io.compression.dll에 대한 참조가 필요합니다 집회.

사용하기가 상당히 간단하며 MSDN에 대한 링크는 몇 가지 좋은 예를 제공합니다.

또한 Microsoft는 다음을 만들었습니다 Microsoft 압축 Nuget 패키지, 지원을 추가합니다 ZipArchive Windows Phone 8 및 기타 휴대용 클래스 라이브러리 관련 클래스

오래된 스레드는 알고 있지만 .NET 4.5가 System.io.compression에 광범위한 개선을 추가했다고 지적하고 싶습니다. 이제 .zip 파일을 아주 잘 조작 할 수 있습니다. 파일을 추출하고 압축하는 단계없이 스트림이 가능하거나 읽고 쓰기로 지퍼 내에 개별 파일을 노출시키는 것까지도 하락할 수 있습니다.

예, 과거에 사용했습니다. 나는 하위 클래스했다 데이터 세트 한 번은 파일에 지속되는 지원을 지원합니다 ( readxml/쓰기 xml 방법). 추가 보너스로서, 나는 원하는 경우 선택적으로 압축을 허용하기로 결정했습니다 (이미 알고 있듯이 XML과 같은 텍스트 데이터에 매우 효과적입니다).

나는 그것을 사용했다 gzipstream 수업 (관련 당시에는 내 이해였습니다. deflatestream 헤더 정보가없는 GZIP 또는 그와 같은 일부일뿐입니다. 그것은 다른 스트림 위에 피기 백으로 꽤 단순히 작동하여 그 자리에 gzipstream을 사용합니다. 제 경우에는 파이낸스 트림에서 돼지가 공간이되었습니다.

주어진 a 메모리 스트림 출력으로 가득 차 있습니다 myDataSet.WriteXML(), 나는 다음과 같은 일을했다.

if (CompressData)
{
    // Write to memory
    mStream = new MemoryStream();
    Save(mStream);
    mStream.Seek(0, SeekOrigin.Begin);

    // Filter that through a GZipStream and then to file
    fStream = new FileStream(Path.Combine(CacheFilePath, FileName + ".gz"),
                             FileMode.OpenOrCreate);
    zipStream = new GZipStream(fStream, CompressionMode.Compress, true);

    Pump(mStream, zipStream);
}
else
{
    // Write straight to file
    fStream = new FileStream(Path.Combine(CacheFilePath, FileName),
                             FileMode.OpenOrCreate);
    Save(fStream);
}

어디에 Save() 그리고 Pump() 다음과 같은 간단한 방법입니다.

private void Pump(Stream input, Stream output)
{
    int n;
    byte[] bytes = new byte[4096]; // 4KiB at a time

    while ((n = input.Read(bytes, 0, bytes.Length)) != 0)
    {
        output.Write(bytes, 0, n);
    }
}

public void Save(Stream stream)
{
    AcceptChanges();

    WriteXml(stream, XmlWriteMode.WriteSchema);
}
    public static void zIpDatabseFile(string srcPath, string destPath)
    {//This is for  Zip a File
        using (var source = new FileStream(srcPath, FileMode.Open, FileAccess.Read, FileShare.Read))
        using (var dest = new FileStream(destPath, FileMode.OpenOrCreate, FileAccess.Write))
        using (var zip = new GZipStream(dest, CompressionMode.Compress))
        {
            source.CopyTo(zip);
        }
    }
    public static void uNzIpDatabaseFile(string SrcPath, string DestPath)
    {// This is for unzip a files.
        using (var source = new FileStream(SrcPath, FileMode.Open, FileAccess.Read, FileShare.Read))
        using (var dest = new FileStream(DestPath, FileMode.OpenOrCreate, FileAccess.Write))
        using (var zip = new GZipStream(source, CompressionMode.Decompress))
        {
            zip.CopyTo(dest);
        }
    }
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top