Как извлечь zip-файл в каталог и перезаписать? - PullRequest
0 голосов
/ 08 сентября 2018

Я создал небольшую программу, которая загружает файл .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 голосов
/ 09 сентября 2018

Хотя метод ExtractToDirectory по умолчанию не поддерживает перезапись файлов, метод ExtractToFile имеет перегрузку , которая принимает вторую логическую переменную это позволяет перезаписать извлекаемый файл. Что вы можете сделать, так это перебрать файлы внутри архива и извлечь их один за другим, используя 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().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...