2014-09-11 5 views
3

간단한 코드 스 니펫을 사용하여 log4net 로그 파일에서 zip 파일을 만듭니다. 아래 코드를 참조하십시오.Log4Net 로그 파일에서 zip을 생성하면 System.IO.IOException이 발생합니다.

var logFiles = Directory.GetFiles(log4netfolderName, "*.log*"); 
using (var zip = ZipFile.Open(destinationDirectory.DirectoryPath + "Test.zip", 
ZipArchiveMode.Create)) 
{ 
    foreach (var file in logFiles) 
    { 
     zip.CreateEntryFromFile(file, 
     Path.GetFileName(file), CompressionLevel.Optimal); 
    } 
} 

문제는 log4net 현재 로그 파일을 사용하고 내가 얻을 "다른 프로세스에서 사용 중이기 때문에 프로세스가 파일을 ''에 액세스 할 수 없습니다." (System.IO.IOException)

또한 나는 Process cannot access the file "MyFile.log" because it is being used by another process에 주어진 또는 ZipFile 클래스에하여 FileStream을 사용하는 방법을 잘 모릅니다으로 최소한의 잠금을 사용하는 log4net의 설정을 변경할 수 없습니다. 어떻게 해결해야합니까?

+0

파일 스트림을 사용하여 전체 파일을 읽을 수는 있지만 파일 *에서 * 항목을 만들지는 못합니다. 지금 당장은 모르겠다. 단지 가정 일 뿐이다. –

+0

죄송합니다. 임시 파일을 만들고 청소하지 않으려면 내 마지막 수단이 될 것입니다 ... – CarbineCoder

+0

이것은 내가 당신에게 제안한 것에 대한 이해입니다. 제안 된 접근법에 임시 파일이 없습니다 ... –

답변

6

ZipFileExtensions 클래스를 찾고 해당 코드를 사용하여 광산을 다시 작성하십시오. 고침은 이렇게 가고, 나의 대답을 고치거나 개선 할 자유를 느낀다.

var logFiles = Directory.GetFiles(folderName,"*.log.*"); 
using (var zip = ZipFile.Open(destinationDirectory.DirectoryPath + "Test.zip", 
ZipArchiveMode.Create)) 
{ 
    foreach (var file in logFiles) 
    { 
     using (var stream = new FileStream(file, FileMode.Open, FileAccess.Read, 
      FileShare.Delete | FileShare.ReadWrite)) 
     { 
      var zipArchiveEntry = zip.CreateEntry(Path.GetFileName(file), 
       CompressionLevel.Optimal); 
      using (var destination1 = zipArchiveEntry.Open()) 
       stream.CopyTo(destination1); 
     } 
    } 
} 
관련 문제