2013-03-17 8 views
9

Używam standardowych bibliotek VB.NET do wyodrębniania i kompresowania plików. Działa również, ale problem pojawia się, gdy muszę wyodrębnić i pliki już istnieją.System.IO.Compression i ZipFile - wypakuj i nadpisaj

Kod używam

Import:

Imports System.IO.Compression 

Metoda Zadzwonię kiedy się zawiesi

ZipFile.ExtractToDirectory(archivedir, BaseDir) 

archivedir i basedir są ustawione, a także, w rzeczywistości to działa, jeśli nie ma żadnych plików nadpisać. Problem pojawia się dokładnie wtedy, gdy są.

Jak mogę nadpisać pliki w ekstrakcji bez użycia bibliotek thirdy-part?

(Uwaga używam jako odniesienia System.IO.Compression i System.IO.Compression.Filesystem)

Ponieważ pliki iść w wielu folderach mający już nieistniejących plików Chciałbym uniknąć ręcznego

IO.File.Delete(..) 

Odpowiedz

11

Zastosowanie ExtractToFile z nadpisać jak prawdziwy nadpisać istniejący plik, który ma taką samą nazwę jak plik docelowy

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

Wydaje się działać lepiej, ale teraz nie działa w przypadku głupich plików systemowych, takich jak "Thumbs.db", które powodują awarię wykonywania i nadpisywania. Jakieś pomysły? – user1714647

+1

Inna kwestia: wydaje się, że plik nie jest kopiowany, jeśli folder, który musi je zawierać, nie istnieje. – user1714647

+0

Proponuję użyć niestandardowej logiki zip i usunąć wszystkie niechciane pliki, takie jak "Thumbs.db"; dla drugiego użyj kolejnego kodu If IO.Directory.Exists (path) = False Then IO.Directory.CreateDirectory (path) – volody

6

znalazłem następujące wyko W pełni działała w celu rozwiązania problemów opisanych powyżej, uruchomiona bez błędów iz powodzeniem zastąpiła istniejące pliki i utworzone katalogi w razie potrzeby.

 ' 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 
Powiązane problemy