stefanlausl
Goto Top

Rekursives Auslesen von Zipfiles im Zipfile

Hallo,

ich möchte den Inhalt von Zipdateien mit C# auslesen.
Das funktioniert schon soweit.
Aber: Das Zipfile kann außer Dateien auch noch Ordner und andere Zipfiles mit Dateien und Unterordnern enthalten.
Leider habe ich keine Idee was hier zu tun ist.
Vielleicht könnt ihr mir da weiter helfen.

Vielen Dank schon mal im Voraus

 private void ReadFilesInZipFile(FileInfo zipFile)
        {

           using (var fileStream = System.IO.File.Open(zipFile.FullName, System.IO.FileMode.Open))
            {
                var parentArchive = new ZipArchive(fileStream);

                var result = from currEntry in parentArchive.Entries
                             where !String.IsNullOrEmpty(currEntry.Name)
                             select currEntry;


                foreach (var entry in result)
                {

                   //DateiInformationen lesen und in Datenbank schreiben
                }

            }  
                        
        }

Content-ID: 361953

Url: https://administrator.de/contentid/361953

Ausgedruckt am: 16.11.2024 um 11:11 Uhr

135185
Lösung 135185 23.01.2018 um 10:05:31 Uhr
Goto Top
Rufe deine Funktion rekursiv auf, also in deiner Funktion prüfst du per if-else ob es ein Ordner ist oder ein Zipfile. Ob es ein Ordner ist bekommst du aus der Eigenschaft IsFolder des entries. Ist es kein Ordner sondern eine Datei mit der Endung ZIP dann entpackst du dieses Entry und rufst dann mit dem FileInfo deine Methode erneut auf. Dritter IF-ELSEIF Fall: Es ist eine Reguläre Datei, dort machst du dann deine Verarbeitung in die DB.
Fertig ist die Kiste.

Einfaches Prinzip. Deine Methode ruft sich aus sich selbst erneut auf, so arbeitet man sich rekursiv durch alle entries.

Gruß Sepp.
StefanLausL
StefanLausL 23.01.2018 um 10:33:58 Uhr
Goto Top
Danke Geht !!

 private void ReadZipFile(Stream fileStream)
        {
            
            
            var parentArchive = new ZipArchive(fileStream);

            var result = from currEntry in parentArchive.Entries
                         where !String.IsNullOrEmpty(currEntry.Name)
                         select currEntry;

            foreach (var entry in result)
            {
                filePath = filePath + "\\" + entry.Name;  
                if (entry.Name.Contains(".zip"))  
                {
                    using (Stream itemStream = entry.Open())
                    {
                        this.ReadZipFile(itemStream);
                    }
                }
                else
                {
                    //Mach was
                }

            }


        }

      
135185
135185 23.01.2018 aktualisiert um 10:55:20 Uhr
Goto Top
Da fehlt aber noch das Prüfen des Entries ob es ein Ordner im Zipfile ist, s. Hinweis oben.
Und das
entry.Name.Contains(".zip")
Ist nicht dein Ernst?? Dafür gibt es die Methode IO.Path.GetExtension, denn sonst matcht er dir auch Dateien ala blablup.zip.xyz und auch nicht Dateien mit blablub.ZIP , contains ist case sensitive.
https://msdn.microsoft.com/de-de/library/dy85x1sa(v=vs.110).aspx