Entwickler-Ecke

IO, XML und Registry - ZipArchive und das Brett vor dem Kopf


OlafSt - So 12.10.14 22:17
Titel: ZipArchive und das Brett vor dem Kopf
Hallo Freunde,

frisch umgestiegen auf VS2012 möchte ich gern die neuen IO.Compression-Klassen nutzen. Aber ich habe da ein dickes Brett vor dem Kopf.

Wo man auch sucht und was man auch per Tante Kugel so aufstöbert, über all - und wirklich überall - findet man das gleiche Beispiel aus der MSDN


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
static void Main(string[] args) {

    const string zipFilePath = @"C:\apps\Sample Pictures.zip";

    using (FileStream zipFileToOpen = new FileStream(zipFilePath, FileMode.Open))
    using (ZipArchive archive = new ZipArchive(zipFileToOpen, ZipArchiveMode.Update)) {

        ZipArchiveEntry readMeEntry = archive.CreateEntry("ReadMe.txt");
        using (StreamWriter writer = new StreamWriter(readMeEntry.Open())) {
            writer.WriteLine("Lorem ipsum dolor sit amet...");
            writer.Write("Proin rutrum, massa sed molestie porta, urna...");
        }
    }
}


So. Nun habe ich aber keinen Stramwriter, in den ich manuell irgendwelchen Text schreibe. Habe ich nicht und krieg ich auch nicht wieder rein.

Wie bekomme ich eine Datei in dieses ZipArchiveEntry ? Meine Vermutung ist, den StreamWriter aus dem Beispiel zu nutzen, einen weiteren StreamReader auf meine Datei zu setzen und dann den StreamReader in den StreamWriter schreiben zu lassen (StreamReader.ReadToEnd oder so ähnlich, IIRC).

Ist das wirklich so umständlich ?

Danke für das Brecheisen.


Ralf Jansen - So 12.10.14 23:09

Zitat:
Wie bekomme ich eine Datei in dieses ZipArchiveEntry ?


CreateEntryFromFile [http://msdn.microsoft.com/de-de/library/hh485720(v=vs.110).aspx]


OlafSt - Mo 13.10.14 00:54

Okay, habe meinen Code entsprechend angepaßt:


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
        private void CompressFile(string AFileName)
        {
            string ZipFileName = Path.ChangeExtension(AFileName, ".ZIP");
            using (FileStream zipToOpen = new FileStream(ZipFileName, FileMode.OpenOrCreate))
            {
                using (ZipArchive za = new ZipArchive(zipToOpen,ZipArchiveMode.Update))
                {
                     za.CreateEntryFromFile(AFileName, AFileName);
                }
            }
        }


Compiliert sauber, läuft sauber. Entstehendes ZIP-Archiv ist allerdings leer. Entsprechende Threads bei StackOverflow et. al. liefern nur Hinweise auf ein evtl. fehlendes Dispose, das hier aber nicht fehlen kann (using-Block).


Ralf Jansen - Mo 13.10.14 12:18

Hast du dir das von der Funktion zurückgelieferte ZipArchiveEntry angesehen? Wie sieht dessen FullName aus?
Ich hab damit wenig Erfahrung fände es aber merkwürdig wenn du ins Zip einen entryName als absoluten Pfad einträgst.


OlafSt - Mo 13.10.14 23:53

Aha... Ich habe

C#-Quelltext
1:
za.CreateEntryFromFile(AFileName, AFileName);                    

durch

C#-Quelltext
1:
za.CreateEntryFromFile(AFileName, Path.GetFileName(AFileName));                    

ersetzt. Und siehe da, das Archiv ist nicht mehr leer.

Frage beantwortet, danke für das Brecheisen.