[C#] .net에서 프로그래밍 방식으로 파일 압축 해제
압축 파일을 프로그래밍 방식으로 압축 해제하려고합니다.
System.IO.Compression.GZipStream
.NET 에서 클래스를 사용해 보았지만 앱이 실행될 때 (실제로 단위 테스트)이 예외가 발생합니다.
System.IO.InvalidDataException : GZip 헤더의 매직 번호가 올바르지 않습니다. GZip 스트림을 전달하고 있는지 확인하십시오.
지금은 실현 .zip
파일이 동일하지 않습니다 .gz
파일 및 그 GZip
와 동일하지 않습니다 Zip
.
그러나 압축 파일을 수동으로 두 번 클릭 한 다음 “모든 파일 추출”버튼을 클릭하여 파일을 추출 할 수 있기 때문에 코드에서도 파일을 추출하는 방법이 있어야한다고 생각합니다.
따라서 Process.Start()
압축 파일의 경로를 입력 으로 사용하려고했습니다 . 이로 인해 앱이 압축 파일의 내용을 보여주는 창을 열게됩니다. 괜찮습니다. 그러나 “모든 파일 추출”버튼을 클릭하지 않아도 서버에 앱이 설치됩니다.
그렇다면 앱에서 압축 파일의 파일을 추출하려면 어떻게해야합니까?
아니면 다른 방법이 있습니까? 타사 라이브러리 또는 앱을 다운로드하지 않고 코드로 작성하는 것을 선호합니다. 보안 부서는 그것에 대해 너무 화려하지 않습니다 …
답변
많은 프로젝트에서 SharpZipLib을 성공적으로 사용 했습니다. 나는 그것이 타사 도구라는 것을 알고 있지만, 소스 코드가 포함되어 있으며 바퀴를 재발 명하기로 선택한 경우 통찰력을 제공 할 수 있습니다.
답변
와 .NET 4.5 할 수 있습니다 .NET Framework를 사용하여 지금 압축 해제 파일 :
using System;
using System.IO;
namespace ConsoleApplication
{
class Program
{
static void Main(string[] args)
{
string startPath = @"c:\example\start";
string zipPath = @"c:\example\result.zip";
string extractPath = @"c:\example\extract";
System.IO.Compression.ZipFile.CreateFromDirectory(startPath, zipPath);
System.IO.Compression.ZipFile.ExtractToDirectory(zipPath, extractPath);
}
}
}
위 코드는 Microsoft 설명서에서 직접 가져 왔습니다. http://msdn.microsoft.com/en-us/library/ms404280(v=vs.110).aspx
ZipFile
어셈블리에 포함되어 System.IO.Compression.FileSystem
있습니다. (감사합니다 nateirvin … 아래 의견 참조)
답변
.Net 4.5 이상
압축되지 않은 파일을 디스크에 쓰는 것이 항상 바람직한 것은 아닙니다. ASP.Net 개발자는 응용 프로그램이 파일 시스템에 쓸 수있는 권한을 부여 할 수있는 권한으로 바이올린을 사용해야합니다. 메모리의 스트림으로 작업함으로써 모든 것을 회피하고 파일을 직접 읽을 수 있습니다.
using (ZipArchive archive = new ZipArchive(postedZipStream))
{
foreach (ZipArchiveEntry entry in archive.Entries)
{
var stream = entry.Open();
//Do awesome stream stuff!!
}
}
또는 다음을 호출하여 압축 해제 된 파일을 디스크에 쓸 수 있습니다 ExtractToFile()
.
using (ZipArchive archive = ZipFile.OpenRead(pathToZip))
{
foreach (ZipArchiveEntry entry in archive.Entries)
{
entry.ExtractToFile(Path.Combine(destination, entry.FullName));
}
}
ZipArchive
클래스 를 사용하려면 System.IO.Compression
네임 스페이스 및에 대한 참조를 추가해야 합니다 System.IO.Compression.FileSystem
.
답변
무료이며 외부 DLL 파일이 없습니다. 모든 것이 하나의 CS 파일에 있습니다. 하나의 다운로드는 CS 파일 일 뿐이고 다른 하나의 다운로드는 이해하기 쉬운 예입니다. 오늘 시도했지만 설치가 얼마나 간단한 지 믿을 수 없습니다. 첫 시도, 오류 없음, 아무것도하지 않았습니다.
https://github.com/jaime-olivares/zipstorer
답변
http://www.codeplex.com/DotNetZip 의 DotNetZip 라이브러리를 사용 하십시오.
zip 파일 조작을위한 클래스 라이브러리 및 도구 세트. VB, C # 또는 .NET 언어를 사용하여 zip 파일을 쉽게 생성, 추출 또는 업데이트하십시오 …
DotNetZip은 전체 .NET Framework가 설치된 PC에서 작동하며 .NET Compact Framework를 사용하는 모바일 장치에서도 실행됩니다. VB, C # 또는 .NET 언어 또는 스크립팅 환경에서 zip 파일을 작성하고 읽습니다.
.NET BCL에 내장 된 클래스를 대체하기 위해 더 나은 DeflateStream 또는 GZipStream 클래스 만 있으면 DotNetZip도 있습니다. DotNetZip의 DeflateStream 및 GZipStream은 Zlib의 .NET 포트를 기반으로 독립 실행 형 어셈블리로 제공됩니다. 이 스트림은 압축 수준을 지원하고 내장 클래스보다 훨씬 우수한 성능을 제공합니다. 세트를 완료하기위한 ZlibStream도 있습니다 (RFC 1950, 1951, 1952) …
답변
String ZipPath = @"c:\my\data.zip";
String extractPath = @"d:\\myunzips";
ZipFile.ExtractToDirectory(ZipPath, extractPath);
ZipFile 클래스를 사용하려면 프로젝트에서 System.IO.Compression.FileSystem 어셈블리에 대한 참조를 추가해야합니다.
답변
표준 zip 파일은 일반적으로 수축 알고리즘을 사용합니다.
타사 라이브러리를 사용하지 않고 파일을 추출하려면 DeflateStream을 사용하십시오. Microsoft는 압축 알고리즘 만 제공하므로 zip 파일 아카이브 형식에 대한 추가 정보가 필요합니다.
zipfldr.dll을 사용해 볼 수도 있습니다. Microsoft의 압축 라이브러리입니다 (보내기 메뉴에서 압축 된 폴더). com 라이브러리 인 것처럼 보이지만 문서화되어 있지 않습니다. 실험을 통해 효과를 얻을 수 있습니다.