22

ファイルの抽出と圧縮に標準の VB.NET ライブラリを使用しています。それも同様に機能しますが、抽出する必要があり、ファイルが既に存在する場合に問題が発生します。

私が使用するコード

輸入品:

Imports System.IO.Compression

クラッシュ時に呼び出すメソッド

ZipFile.ExtractToDirectory(archivedir, BaseDir)

archivedir と BaseDir も設定されています。実際には、上書きするファイルがない場合に機能します。問題はまさにそこにあるときに起こります。

サードパーティ ライブラリを使用せずに抽出でファイルを上書きするにはどうすればよいですか?

(参照 System.IO.Compression および System.IO.Compression.Filesystem として使用していることに注意してください)

ファイルはすでに存在するファイルを持つ複数のフォルダーにあるため、手動は避けます

IO.File.Delete(..)
4

2 に答える 2

25

宛先ファイルと同じ名前の既存のファイルを上書きするには、overwrite を true にしてExtractToFileを使用します。

    Dim zipPath As String = "c:\example\start.zip" 
    Dim extractPath As String = "c:\example\extract" 

    Using archive As ZipArchive = ZipFile.OpenRead(zipPath)
        For Each entry As ZipArchiveEntry In archive.Entries
            entry.ExtractToFile(Path.Combine(extractPath, entry.FullName), True)
        Next 
    End Using 
于 2013-03-18T00:53:37.763 に答える
12

次の実装は、上記の問題を解決するために完全に機能し、エラーなしで実行され、必要に応じて既存のファイルと作成されたディレクトリを正常に上書きすることがわかりました。

        ' Extract the files - v2
        Using archive As ZipArchive = ZipFile.OpenRead(fullPath)
            For Each entry As ZipArchiveEntry In archive.Entries
                Dim entryFullname = Path.Combine(ExtractToPath, entry.FullName)
                Dim entryPath = Path.GetDirectoryName(entryFullName)
                If (Not (Directory.Exists(entryPath))) Then
                    Directory.CreateDirectory(entryPath)
                End If

                Dim entryFn = Path.GetFileName(entryFullname)
                If (Not String.IsNullOrEmpty(entryFn)) Then
                    entry.ExtractToFile(entryFullname, True)
                End If
            Next
        End Using
于 2015-05-01T21:57:40.800 に答える