3

zip.MaxOutputSegmentSize を十分に高く設定すると、動作する zip ファイルは 1 つだけになります。MaxOutputSegmentSize を制限するとすぐに、分割ファイルの 1 つが最大サイズに達した後にこのエラーが発生します。後でいくつかのファイルが発生します。

zip.ZipErrorAction = ZipErrorAction.Skip または .Retry を使用すると、代わりに System.ObjectDisposedException が発生します。

ここで何が問題なのですか、それとも DotNetZip ライブラリのバグですか?

ZipFile zip = new ZipFile(backupPath + "Backup.zip");
            zip.MaxOutputSegmentSize = maxSize;
            //zip.TempFileFolder = @"D:\Backup\Temp"; //seems not to make any difference

            zip.Comment = "Backup created at " + System.DateTime.Now.ToString("G");
            zip.AddFile(dbBackup.FullName,"Database");
            zip.AddDirectory(physicalAppPath,"Application");

           zip.AddDirectory(mailArchivePath,"MailArchive");
           zip.Save(); //Exception occurs here

スタックトレース:

bei System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
bei System.IO.File.Move(String sourceFileName, String destFileName)
bei Ionic.Zip.ZipSegmentedStream.TruncateBackward(UInt32 diskNumber, Int64 offset)
bei Ionic.Zip.ZipEntry.Write(Stream s)
bei Ionic.Zip.ZipFile.Save()
bei MyProject.Configuration.Backup.BackupLogic.Backup(Boolean monthly) in D:\projects\MyProject.Configuration\Backup\BackupLogic.cs:Zeile 100.
bei MyProject.Configuration.Backup.BackupLogic.ScheduledBackup() in D:\projects\MyProject.Configuration\Backup\BackupLogic.cs:Zeile 42.
bei MyProject.Configuration.BackupTimer.CreateThread(Object parameters) in D:\projects\MyProject.Configuration\BackupTimer.cs:Zeile 60.
bei System.Threading.ExecutionContext.runTryCode(Object userData)
bei System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode code, CleanupCode backoutCode, Object userData)
bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
bei System.Threading.ThreadHelper.ThreadStart(Object obj)

ZipErrorAction.Skip を使用する場合の例外と StackTrace:

ObjectDisposed Exception was unhandled: Auf eine geschlossene Datei kann nicht zugegriffen werden. (Could not access an closed file)

bei System.IO.FileStream.get_Position()
bei Ionic.Zip.ZipEntry.Write(Stream s)
bei Ionic.Zip.ZipFile.Save()
...

宛先フォルダーのフィルターを使用したプロセス モニターは、疑わしいものを何も表示しません: (この場合、3 つの分割ファイルが作成され、例外が発生しました)

12:35:25.6312905 PM w3wp.exe    5380    CreateFile  D:\Backup   SUCCESS Desired Access: Write Data/Add File, Synchronize, Disposition: Open, Options: , Attributes: n/a, ShareMode: Read, Write, AllocationSize: n/a, Impersonating: NT-AUTORITÄT\IUSR, OpenResult: Opened
12:35:25.6319249 PM w3wp.exe    5380    CloseFile   D:\Backup   SUCCESS 
12:35:27.7507327 PM w3wp.exe    5380    CreateFile  D:\Backup   SUCCESS Desired Access: Write Data/Add File, Synchronize, Disposition: Open, Options: , Attributes: n/a, ShareMode: Read, Write, AllocationSize: n/a, Impersonating: NT-AUTORITÄT\IUSR, OpenResult: Opened
12:35:27.7511904 PM w3wp.exe    5380    CloseFile   D:\Backup   SUCCESS 
12:35:32.9936509 PM w3wp.exe    5380    CreateFile  D:\Backup   SUCCESS Desired Access: Write Data/Add File, Synchronize, Disposition: Open, Options: , Attributes: n/a, ShareMode: Read, Write, AllocationSize: n/a, Impersonating: NT-AUTORITÄT\IUSR, OpenResult: Opened
12:35:32.9941529 PM w3wp.exe    5380    CloseFile   D:\Backup   SUCCESS 
4

1 に答える 1

1

問題は、1つのフォルダにgzipファイル(パスワード付きの.gz)があることでした-DotNetZipはそれらを分割できないようです(7zipはできます)。したがって、それらのgzipファイルで満たされた.zipファイルの終わりに達するとすぐに、例外が発生します。

今は回避策を使用したので、すべてのファイルを循環させ、合計サイズを計算し、最大サイズに達するたびに単一の(分割されていない)zipファイルを作成します。

DotNetZipの問題(バグ?)は残っています。

于 2011-08-24T13:44:51.500 に答える