zip 파일을 읽고 쓰기 위해 System.io.compression을 사용하는 방법?
-
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);
}
}