如何提取一个zip文件到目录并覆盖?

时间:2018-09-08 20:48:12

标签: vb.net zipfile overwrite

我制作了一个小程序,可以从我的网站下载.zip文件,然后将其安装在特定目录中。除非已经存在相同名称的文件,否则它将正常工作,然后出现错误。这是我的代码。

If Form1.CheckBox1.Checked = True Then
    Label4.Text = "Downloading Test File!"
    wc.DownloadFileAsync(New Uri("http://www.example.com/TestFile.zip"), Directory + "\TestFile.zip")
    While wc.IsBusy = True
        Application.DoEvents()
    End While
    ListBox1.Items.Add("Test File")
End If

'Install
If Form1.CheckBox1.Checked = True Then
    ZipFile.ExtractToDirectory(Directory + "\TestFile.zip", Directory_Select.TextBox1.Text)
    ListBox2.Items.Add("Test File")
End If

例如,如果“ TestFile.zip”中的文件与“安装位置”具有相同的名称,它将给我以下错误:

  

文件'filePath`已经存在。

由于相同名称的文件已存在,因此提取操作尚未完成。事先删除文件不是一个好方法,因为将有多个同名文件。

提取时如何替换?

还有一种方法可以暂停程序,直到文件完成提取为止,因为某些文件很大,提取它们需要一些时间。

预先感谢您的帮助,我是新来的并且还在学习。感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

尽管ExtractToDirectory方法默认情况下不支持覆盖文件,但是ExtractToFile方法具有一个overload,它需要第二个 boolean 变量,该变量可让您覆盖正在提取的文件。您可以执行的操作是遍历存档文件中的文件,然后使用ExtractToFile(filePath, True)逐个提取它们。

我创建了一个扩展方法,可以做到这一点,并且已经使用了一段时间。希望您觉得有用!

将以下模块添加到您的项目中:

Module ZipArchiveExtensions

    <System.Runtime.CompilerServices.Extension>
    Public Sub ExtractToDirectory(archive As ZipArchive,
                                  destinationDirPath As String, overwrite As Boolean)
        If Not overwrite Then
            ' Use the original method.
            archive.ExtractToDirectory(destinationDirPath)
            Exit Sub
        End If

        For Each entry As ZipArchiveEntry In archive.Entries
            Dim fullPath As String = Path.Combine(destinationDirPath, entry.FullName)

            ' If it's a directory, it doesn't have a "Name".
            If String.IsNullOrEmpty(entry.Name) Then
                Directory.CreateDirectory(Path.GetDirectoryName(fullPath))
            Else
                entry.ExtractToFile(fullPath, True)
            End If
        Next entry
    End Sub

End Module

用法:

Using archive = ZipFile.OpenRead(archiveFilePath)
    archive.ExtractToDirectory(destPath, True)
End Using

旁注::不要将字符串连接起来以形成其各个部分的路径;改用Path.Combine()