解压缩后无法删除zip文件

时间:2012-06-05 12:03:00

标签: c# zip extract dotnetzip

我有一个方法可以提取多个zip文件,但在应用程序关闭之前无法删除它们。我认为这是DotNetZip version 1.9.1.5库中的一个错误。

我的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()

1 个答案:

答案 0 :(得分:4)

v1.9.1.6之前的版本存在一个错误,在您解压缩后无法删除文件。也许你需要升级?但请告诉我们您的版本。

有关详细信息,请参阅CodePlex上的此WorkItem:http://dotnetzip.codeplex.com/workitem/12521