2016-09-01 8 views
0

제목에서 말한 것처럼 우편으로 지퍼를 만들려고합니다. \ test.zip \ project.zip 유효한되지 않습니다 : 경로 C가 있기 때문에ZipArchive 클래스를 사용하여 C#의 아카이브 내부에 아카이브를 만듭니다.

나는, 내가 가정입니다 "TargetFilePath"

var projectDirectoryPath = currentProjectViewModel.DirectoryPath; 
ZipFile.CreateFromDirectory(projectDirectoryPath, [email protected]"/Project.zip"); 

은 위의 작동하지 않습니다라는 변수에 생성 우편 아카이브를 가지고 통로.

편집 : 명확하게 말하면 일부 파일을 압축하여 다른 압축 파일에 압축을 넣고 싶습니다. 타사 방식이 아닌 System.IO.Compression을 사용해야합니다.

: 나의 이해에서

내 경험 또한, 압축 파일의 대상 주소를 생성해야하고, 그 대상 주소는 "\ test.zip \ project.zip C"로 잘못된 경로가 될 수 없습니다

+0

재귀 호출은 아마도? –

+1

'projectDirectoryPath'에 .zip 파일 + 그 안에있는 다른 파일이 있으면 그냥 작동해야합니다. 이미 .zip 파일이 있고 그 파일에 zip 파일을 추가하려면 [this] (https://msdn.microsoft.com/en-us/library/hh158346(v=vs.110) .aspx) 그것을하는 한 가지 방법이지만 그것은 나에게 고통처럼 보입니다. 난 그냥 안으로 밖으로 일하고, 내부 zip 파일을 먼저 만든 다음 우편 번호를 만들고 대신 다른 파일을 추가하는 대신 압축하십시오. 다른 옵션에 대해서는 [here] (https://msdn.microsoft.com/en-us/library/system.io.compression.zipfile (v = vs.110) .aspx)를 참조하십시오. – Quantic

+1

또는 기존 zip 파일을 디렉토리로 추출하고 다른 zip 파일을 복사 한 다음 동일한 명령을 사용하여 해당 폴더를 압축하십시오. 나는이 말을 [ZipArchive.CreateEntry] (https://msdn.microsoft.com/en-us/library/hh158346(v=vs.110) .aspx)는 당신이 할 수없는 곳에서는 다루기 힘들어 보입니다. 파일을 zip "으로 변환하려면 파일을 어떻게 든 스트리밍해야합니다. 리소스가 있다면 약간의 IO와 약간의 시간을 사용하여 삶을 편하게 만듭니다. IMO. – Quantic

답변

2

가장 쉬운 방법은 projectDirectoryPath의 내용으로 임시 파일에 zip 파일을 만들고 일단 완료되면 해당 파일을 대상 zip 아카이브에 추가하는 것입니다. 이 같은

그래서 기본적으로 뭔가 :

var projectDirectoryPath = currentProjectViewModel.DirectoryPath; 
var tempFile = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName()); 
try 
{ 
    ZipFile.CreateFromDirectory(projectDirectoryPath, tempFile); 

    using (var archive = ZipFile.Open(TargetFilePath, ZipArchiveMode.Update)) 
    { 
     archive.CreateEntryFromFile(tempFile, "Project.zip", CompressionLevel.NoCompression); 
    } 
} 
finally 
{ 
    System.IO.File.Delete(tempFile); 
} 

내가 우편 아카이브가 이미 압축 및 압축의 또 다른 층 여기에 값을 추가하지 않습니다 때문에 CompressionLevel.NoCompression을 사용하는 것이 좋습니다. 아카이브를 열 때 ZipArchiveMode.Update을 사용하면 zip 파일이 실제로 변경되므로 중요합니다. 이 열거 자의 다른 값은 처음부터 새 아카이브를 만들거나 읽기 전용으로 열 때 사용됩니다.

예에서 나는 CreateEntryFromFile 기능을 사용했다. 확장 메서드이므로 using 선언에 네임 스페이스가 있는지 확인하십시오.

임시 파일이 필요 없도록 구현할 수 있지만 더 많은 코드가 필요합니다. 새 zip 파일을 직접 만들고 스트림을 만들 때 얻을 수있는 스트림에 직접 작성해야하기 때문입니다. achive의 새 항목 그러나 대부분의 경우 내가 준 예제는 그 일을해야합니다.

+0

이 방법을 사용할 때 임시 파일이 이미 존재한다는 예외가 발생합니다. –

+0

해결되었습니다. 이제 임시 파일을 생성하는 꽤 안전한 방법을 사용하고 있습니다. 파일 이름이 이미 사용중인 경우에도 실패 할 수 있습니다. 이 기능이 제대로 작동하는지 확인하려면 무료 파일 이름을 얻을 때까지 반복하고 파일이 이미 사용 중인지 확인해야합니다. – Nitram

+0

http://pastebin.com/HyEdu0Sm이 코드는 여전히 동일한 오류를 발생시킵니다. 나는 변수의 값을 검사 할 수 있고 "fileExists"는 false를 돌려 주므로 –