Библиотека DotNetZip: создание разделенного архива - System.UnauthorizedAccessException
Когда я установил zip.MaxOutputSegmentSize достаточно высоко, чтобы работал только один zip-файл. Как только я ограничиваю MaxOutputSegmentSize, я получаю эту ошибку после того, как один из файлов разделения достигает своего максимального размера - когда у меня есть значение, подобное 20 МБ, оно всегда происходит в конце файла ".z02", если значение меньше, оно может также произойдет какой-нибудь файл позже.
Если я использую 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)
Исключение и StackTrace для использования ZipErrorAction.Skip:
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
1 ответ
Проблема заключалась в том, что в одной папке есть файлы gzip (.gz с паролем) - кажется, что DotNetZip не может их разделить (можно 7zip). Поэтому, как только он достигает конца файла.zip, заполненного этими файлами gzip, возникает исключение.
Теперь я использовал обходной путь, поэтому я циклически перебираю все свои файлы, вычисляю общий размер и создаю отдельные (не разделенные) zip-файлы каждый раз, когда достигаю своего максимального размера.
Проблема (ошибка?) Для DotNetZip остается.