Laden...

[done] SharpLibZip - Datei in Zip Datei editieren

Erstellt von C4RL0 vor 5 Jahren Letzter Beitrag vor 5 Jahren 1.430 Views
C4RL0 Themenstarter:in
96 Beiträge seit 2012
vor 5 Jahren
[done] SharpLibZip - Datei in Zip Datei editieren

Hallo zusammen,

ich frage mich, ob es einen anderen Weg gibt, eine vorhandene Datei in einer Zip-Datei zu editieren ohne das Zip-Paket zwischen zu speichern.

Konkreter möchte ich eine Zahl in einer Textdatei ändern. Diese Textdatei ist neben anderen in einem Zip verpackt.

Oder läüft das nur über "Entpacken (und speichern) - Datei editieren - Packen (und löschen)"?

Für das Zip-Handling verwende ich derzeit SharpZipLib.

Danke für die Antworten.


Gruß
Carlo

"Palabras que no coinciden con hechos no valen nada."

1.029 Beiträge seit 2010
vor 5 Jahren

Hi,

das sollte möglich sein, denn:
a) Es ist möglich eine (von vielen Dateien) aus dem Stream zu laden
(siehe https://stackoverflow.com/questions/2971079/sharpziplib-extracting-single-file)
b) Es ist möglich ein ZipFile zu updaten:
(siehe https://github.com/icsharpcode/SharpZipLib/wiki/Updating)

Wäre nett wenn du über das Ergebnis berichtest.

LG

16.806 Beiträge seit 2008
vor 5 Jahren

Du kannst keine Datei in einem Zip editieren. Die Datei musst Du einzeln raus ziehen.
Danach kannst die Datei isoliert überschreiben.

C4RL0 Themenstarter:in
96 Beiträge seit 2012
vor 5 Jahren

Ich hab von SharpLibZip auf DotNetZip umgesattelt, irgendwie gefiel mir die lib besser. Mit folgendem Code gelingt mir mein Vorhaben (ich weiß, bei gleichnamigen files wird derzeit nur das erste geändert)


        /// <summary>
        /// Change Content of a single 
        /// </summary>
        /// <param name="myPath">Path to dedicated zip file</param>
        /// <param name="myFile">File to be modified</param>
        public void modifyZippedFile(string myPath, string myFile)
        {
            string fileContent;
            string targetFile = "";
            using (ZipFile zip = ZipFile.Read(myPath))
            {
                foreach (ZipEntry entry in zip.Entries)
                    if (entry.FileName.Contains(myFile))
                        targetFile = entry.FileName;
                ZipEntry e = zip[targetFile];
                using (StreamReader sr = new StreamReader(e.OpenReader(), Encoding.Default, true))
                {
                    fileContent = sr.ReadToEnd();
                    fileContent = modifyContent(fileContent);
                    zip.RemoveEntry(targetFile);
                    zip.AddEntry(targetFile, fileContent);
                    zip.Save();
                }
            }
        }


Gruß
Carlo

"Palabras que no coinciden con hechos no valen nada."