Autor Beitrag
OlafSt
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 486
Erhaltene Danke: 99

Win7, Win81, Win10
Tokyo, VS2017
BeitragVerfasst: So 12.10.14 22:17 
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

ausblenden 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.

_________________
Lies, was da steht. Denk dann drüber nach. Dann erst fragen.
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4701
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: So 12.10.14 23:09 
Zitat:
Wie bekomme ich eine Datei in dieses ZipArchiveEntry ?


CreateEntryFromFile
OlafSt Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 486
Erhaltene Danke: 99

Win7, Win81, Win10
Tokyo, VS2017
BeitragVerfasst: Mo 13.10.14 00:54 
Okay, habe meinen Code entsprechend angepaßt:

ausblenden 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).

_________________
Lies, was da steht. Denk dann drüber nach. Dann erst fragen.
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4701
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 486
Erhaltene Danke: 99

Win7, Win81, Win10
Tokyo, VS2017
BeitragVerfasst: Mo 13.10.14 23:53 
Aha... Ich habe
ausblenden C#-Quelltext
1:
za.CreateEntryFromFile(AFileName, AFileName);					

durch
ausblenden 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.

_________________
Lies, was da steht. Denk dann drüber nach. Dann erst fragen.