2013-03-17 13 views
9

Sto usando le librerie VB.NET standard per estrarre e comprimere i file. Funziona bene, ma il problema arriva quando devo estrarre e i file esistono già.System.IO.Compression e ZipFile - estrae e sovrascrive

codice che utilizzo

Importazioni:

Imports System.IO.Compression 

Metodo chiamo quando si blocca

ZipFile.ExtractToDirectory(archivedir, BaseDir) 

ArchiveDir e BaseDir sono impostati come bene, infatti funziona se non ci sono file sovrascrivere. Il problema arriva esattamente quando ci sono.

Come posso sovrascrivere i file in estrazione senza utilizzare librerie di terze parti?

(Nota sto usando come riferimento System.IO.Compression e System.IO.Compression.Filesystem)

Dal momento che i file vanno in più cartelle con i file già esistenti Eviterei manuale

IO.File.Delete(..) 

risposta

11

Usa ExtractToFile con sovrascrivere come vero per sovrascrivere un file esistente che ha lo stesso nome del file di destinazione

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 
+0

Sembra funzionare di più, ma ora non funziona per file di sistema stupidi come "Thumbs.db" che fanno fallire l'esecuzione e la sovrascrittura. Qualche idea? – user1714647

+1

Un altro problema: sembra non copiare il file se la cartella che deve contenerli non esiste. – user1714647

+0

suggerirei di utilizzare la logica zip personalizzata e rimuovere tutti i file indesiderati come "Thumbs.db"; per il secondo si usa il prossimo codice If IO.Directory.Exists (path) = False Then IO.Directory.CreateDirectory (path) – volody

6

ho trovato la seguente Imple mentation ha lavorato pienamente per risolvere i problemi descritti sopra, ha funzionato senza errori e ha sovrascritto con successo i file esistenti e creato le directory secondo necessità.

 ' 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