2012-06-05 67 views
1

我有一種方法可以提取多個zip文件,但在應用程序關閉之前無法刪除它們。我認爲這是DotNetZip version 1.9.1.5庫中的一個錯誤。解壓縮後不能刪除zip文件

我的zip文件:

Hezareh.z01 
Hezareh.z02 
Hezareh.z03 
Hezareh.zip 

代碼提取文件:

 private void InstallUpdates() 
     { 
      string tempDir = Path.Combine(Environment.CurrentDirectory, MainViewModel.TemporaryDirectoryName); 
      string mainZipFileName = Path.Combine(tempDir, 
       _updateConfig.ZipFiles.Single(f => f.IsFirstPart).PathOnClient); // i'm sure this is Hezareh.zip file 
      string installPath = Path.Combine(Environment.CurrentDirectory, Properties.Settings.Default.InstallationDirectory); 
      // i also tried: using (var zipFile = new ZipFile(mainZipFileName)) 
      using (var zipFile = ZipFile.Read(mainZipFileName)) 
      { 
       // same problem for ExtractAll method. 
       // zipFile.ExtractAll(installPath, ExtractExistingFileAction.OverwriteSilently); 
       foreach (ZipEntry entiry in zipFile) 
       { 
        entiry.Extract(installPath, ExtractExistingFileAction.OverwriteSilently); 
       } 
       // zipFile.Close() or any same method does not exists and zipFile.Dispose() is called 
       // automatically but even when i call it manually still have same problem. 
      } 

      DeleteFiles(); 
     } 
     private void DeleteFiles() 
     { 
      var files = Directory.GetFiles(Path.Combine(Environment.CurrentDirectory, MainViewModel.TemporaryDirectoryName)); 
      foreach (string file in files) 
      { 
       File.Delete(file); // exception occure here 
      } 
     } 

This question並沒有爲我工作,我要燒我的頭。

例外:

The process cannot access the file 'D:\Projects\...\App\bin\Debug\UpdaterTemp\Hezareh.z01' because it is being used by another process. 
    at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) 
    at System.IO.File.Delete(String path) 
    at Meshkat.Updater.App.ViewModels.InstallUpdatesViewModel.DeleteDownloadedUpdates() in D:\Projects\Meshkat.Updater\Meshkat.Updater.App\ViewModels\InstallUpdatesViewModel.cs:line 60 
    at Meshkat.Updater.App.ViewModels.InstallUpdatesViewModel.Hide() in D:\Projects\Meshkat.Updater\Meshkat.Updater.App\ViewModels\InstallUpdatesViewModel.cs:line 129 
    at Meshkat.Updater.App.RelayCommand.Execute(Object parameter) in D:\Projects\Meshkat.Updater\Meshkat.Updater.App\RelayCommand.cs:line 146 
    at MS.Internal.Commands.CommandHelpers.CriticalExecuteCommandSource(ICommandSource commandSource, Boolean userInitiated) 
    at System.Windows.Controls.Primitives.ButtonBase.OnClick() 
    at System.Windows.Controls.Button.OnClick() 
    at System.Windows.Controls.Primitives.ButtonBase.OnMouseLeftButtonUp(MouseButtonEventArgs e) 
    at System.Windows.UIElement.OnMouseLeftButtonUpThunk(Object sender, MouseButtonEventArgs e) 
    at System.Windows.Input.MouseButtonEventArgs.InvokeEventHandler(Delegate genericHandler, Object genericTarget) 
    at System.Windows.RoutedEventArgs.InvokeHandler(Delegate handler, Object target) 
    at System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs) 
    at System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised) 
    at System.Windows.UIElement.ReRaiseEventAs(DependencyObject sender, RoutedEventArgs args, RoutedEvent newEvent) 
    at System.Windows.UIElement.CrackMouseButtonEventAndReRaiseEvent(DependencyObject sender, MouseButtonEventArgs e) 
    at System.Windows.UIElement.OnMouseUpThunk(Object sender, MouseButtonEventArgs e) 
    at System.Windows.Input.MouseButtonEventArgs.InvokeEventHandler(Delegate genericHandler, Object genericTarget) 
    at System.Windows.RoutedEventArgs.InvokeHandler(Delegate handler, Object target) 
    at System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs) 
    at System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised) 
    at System.Windows.UIElement.RaiseEventImpl(DependencyObject sender, RoutedEventArgs args) 
    at System.Windows.UIElement.RaiseEvent(RoutedEventArgs args, Boolean trusted) 
    at System.Windows.Input.InputManager.ProcessStagingArea() 
    at System.Windows.Input.InputManager.ProcessInput(InputEventArgs input) 
    at System.Windows.Input.InputProviderSite.ReportInput(InputReport inputReport) 
    at System.Windows.Interop.HwndMouseInputProvider.ReportInput(IntPtr hwnd, InputMode mode, Int32 timestamp, RawMouseActions actions, Int32 x, Int32 y, Int32 wheel) 
    at System.Windows.Interop.HwndMouseInputProvider.FilterMessage(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled) 
    at System.Windows.Interop.HwndSource.InputFilterMessage(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled) 
    at MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled) 
    at MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o) 
    at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Boolean isSingleParameter) 
    at System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Boolean isSingleParameter, Delegate catchHandler) 
    at System.Windows.Threading.Dispatcher.WrappedInvoke(Delegate callback, Object args, Boolean isSingleParameter, Delegate catchHandler) 
    at System.Windows.Threading.Dispatcher.InvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Boolean isSingleParameter) 
    at System.Windows.Threading.Dispatcher.Invoke(DispatcherPriority priority, Delegate method, Object arg) 
    at MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam) 
    at MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG& msg) 
    at System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame) 
    at System.Windows.Threading.Dispatcher.PushFrame(DispatcherFrame frame) 
    at System.Windows.Threading.Dispatcher.Run() 
    at System.Windows.Application.RunDispatcher(Object ignore) 
    at System.Windows.Application.RunInternal(Window window) 
    at System.Windows.Application.Run(Window window) 
    at System.Windows.Application.Run() 
    at Meshkat.Updater.App.App.Main() in D:\Projects\Meshkat.Updater\Meshkat.Updater.App\obj\x86\Debug\App.g.cs:line 0 
    at System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args) 
    at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args) 
    at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() 
    at System.Threading.ThreadHelper.ThreadStart_Context(Object state) 
    at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 
    at System.Threading.ThreadHelper.ThreadStart() 
+2

什麼'DeleteFiles()'做什麼?顯示一些代碼。什麼是錯誤?有沒有? – leppie

+1

另外,你使用的是什麼版本的DotNetZip? v1.9.1.6之前的版本有一個錯誤,在解壓後你無法刪除文件。也許你需要升級?但告訴我們你的版本。 – Faraday

+1

你解壓縮文件只是爲了立即刪除它們嗎?你可能是在和他們做一些你沒有展示的東西?或者你的代碼監視輸出路徑的變化?而不是在庫中查找錯誤,您應該確保您的代碼在您嘗試刪除它們時仍然不能處理文件 –

回答

4

版本之前v1.9.1.6了您提取後,你無法刪除文件的錯誤。也許你需要升級?但告訴我們你的版本。

欲瞭解更多信息,請參閱CodePlex上這個工作項目:http://dotnetzip.codeplex.com/workitem/12521

+1

再次感謝您!現在我可以去睡覺了 – Jalal