2015-01-27 2 views
2

다음 해결책을 통해 파일을 압축하는 유틸리티 메서드를 만들었습니다. 나는 기존의 것과 동일한 이름을 가진 .zip 아카이브를 생성 할 때 그것을 덮어 쓸 것이라는 인상을 받았다. 이 경우는 아니지만 파일이 이미 있음을 알리는 예외가 발생합니다. 기존 zip 파일을 덮어 쓰려면 어떻게합니까?

public static void CompressFile(string zipName, string filePath, string fileName) 
{ 
    try 
    { 
     using (ZipArchive archive = ZipFile.Open(zipName, ZipArchiveMode.Create)) 
     { 
      archive.CreateEntryFromFile(filePath, fileName, CompressionLevel.Fastest); 
     } 
    } 
    catch(Exception e) 
    { 
     _log.Error("Exception Caught: {0}", e.Message); 
    } 
} 

내가 없거나 내가 동일한 이름의 기존 아카이브를 삭제 수표를 작성해야 할거야 부울 덮어 쓰기의 param 곳이 있습니까?

+2

https://msdn.microsoft.com/en-us/library/system.io.compression.ziparchivemode%28v=vs.110%29.aspx "만 허용된다 새 아카이브 항목을 작성" –

+3

및 https://msdn.microsoft.com/en-us/library/hh485716%28v=vs.110%29.aspx :'모드 매개 변수를 만들기로 설정하면 FileMode.CreateNew를 사용하여 아카이브가 열립니다. 파일 모드 값. 아카이브가 이미 존재하면 IOException이 발생합니다. ' –

답변

6

ZipFile.Open에 대한 설명서의 설명을 참조하십시오

당신이 만들 수있는 모드 매개 변수를 설정

는 아카이브 파일 모드 값으로 FileMode.CreateNew으로 열립니다. 아카이브가 이미 존재하면 IOException이 발생합니다. mode 매개 변수를 Update로 설정하면 파일 모드 값으로 FileMode.OpenOrCreate를 사용하여 아카이브가 열립니다. 아카이브가 있으면 열립니다. 기존 항목을 수정하고 새 항목을 작성할 수 있습니다. 아카이브가 없으면 새 아카이브가 작성됩니다. 그러나 업데이트 모드에서 zip 아카이브를 만드는 것은 만들기 모드에서 만드는 것과 같이 효율적이지 않습니다.

그래서 문제는 기본 파일 처리에 달려 있습니다. Create을 ZipArchiveMode로 사용하면 API가 이미 존재하는 파일을 처리하지 않고 암시 적으로 파일을 만들려고합니다. 귀하의 경우에는 Update ZipArchiveMode가 더 적합 할 것입니다. FileMode enumeration은 위에서 언급 한 각 값이 허용하고 요구하는 것에 대해 자세히 설명합니다.

로 보는 경우는 Create 모드에서 아카이브를 열기 전에 존재하는 경우, 당신은 check for its existence에와 delete it가 필요합니다 기존 아카이브 교체보다는 내용을 변경할 말했다되고있다.

+0

오버로드 부울 param이 있다면 그냥 궁금 해서요. 자세한 답변 주셔서 감사합니다! –

1

단순 - 쓰기 전에 지퍼를 삭제하십시오. 전에 존재하지 않았다면 - 아무런 해가되지 않습니다.

안전을 위해 처음에는 새로운 것을 작성한 다음 이전 명령으로 이전 명령으로 이동시킬 수 있습니다.

는에 따르면 https://msdn.microsoft.com/en-us/library/system.io.compression.ziparchive%28v=vs.110%29.aspx

ZipArchive.Open 기존 우편 아카이브에 새 파일을 추가합니다. 올바른 방법을 사용하고 있는지 확인하기 위해 항상 문서를 읽으십시오!

나단

관련 문제