Entwickler-Ecke

IO, XML und Registry - Datei Zippen


Raven280438 - Fr 22.07.11 10:33
Titel: Datei Zippen
Hi,

ich benutze die DotNetZip Library.

Ich versuche eine Methode zu erstellen, mit der man eine Datei in eine Zip-Datei hinzufügen kann. Leider haut das irgendwie nicht hin:

Zuerst erstelle ich die Zip Datei:

C#-Quelltext
1:
2:
3:
4:
if (!File.Exists(this.SaveFile))
{
    File.Create(this.SaveFile);
}


Dann will ich prüfen, ob die Datei schon im Zip-Archive existiert und ggf. hinzufügen

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
        public void BackupFile(String file)
        {
            ZipInputStream ZipStream = new ZipInputStream(File.OpenRead(this.SaveFile));
            ZipEntry theEntry;
            FileInfo fileinfo = new FileInfo(this.SaveFile);
            if (fileinfo.Length > 0)
            {
                while ((theEntry = ZipStream.GetNextEntry()) != null)
                {
                    if (theEntry.IsFile)
                    {
                        if (theEntry.Name == file)
                        {
                            FileInfo fi = new FileInfo(this.TempDir + file);
                            if (theEntry.DateTime == fi.LastWriteTime && theEntry.Size == fi.Length)
                            {
                                //Datei existiert, abbrechen
                                ZipStream.Close();
                                return;
                            }
                        }
                    }
                }
            }
            ZipStream.Close();

            /* Datei Zippen */
            ZipFile zip = new ZipFile(this.SaveFile);       //Hier kommt die Exception
            zip.BeginUpdate();
            zip.Add(this.TempDir + file,file);
            zip.CommitUpdate();
            zip.Close();
        }


Dabei bekomm ich jedoch an der angegebenen Stelle die Exception
Zitat:
Cannot find central directory


Was mache ich falsch?


Gruß


Yogu - Fr 22.07.11 12:40

Hallo,

existiert vielleicht der Ordner, in der die Datei SaveFile liegt, noch nicht?


Raven280438 - Fr 22.07.11 12:54

Hi,

danke für die Antwort. Das Verzeichnis existiert. Ich hab in der Zwischenzeit eine Lösung für das Problem gefunden.

Ich muss die Zip-Datei auf folgende Weise anlegen:

C#-Quelltext
1:
2:
3:
4:
5:
6:
byte[] emptyzip = new byte[]{80,75,5,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
FileStream fs = File.Create(this.SaveFile);
fs.Write(emptyzip, 0, emptyzip.Length);
fs.Flush();
fs.Close();
fs = null;

Kann mir jemand erklären, was genau das mit dem emptyzip soll? ;)


Ich hab jetzt ein neues Problem, wie kann ich eine Datei aus einem Zip-Archiv löschen?


C#-Quelltext
1:
2:
3:
4:
5:
ZipFile zip_del = new ZipFile(this.SaveFile);
zip_del.BeginUpdate();
zip_del.Delete(file);
zip_del.CommitUpdate();
zip_del.Close();

bringt die Exception
Zitat:

Die Datei "C:\Dokumente und Einstellungen\roman\Desktop\backup_tool.zip.361.tmp" konnte nicht gefunden werden.

(Die Zip-Datei heist nur backup_tool.zip)

Gruß


Ralf Jansen - Fr 22.07.11 13:04

Zitat:
Kann mir jemand erklären, was genau das mit dem emptyzip soll?


Mit 'new ZipFile(this.SaveFile);' in deinem Code versuchst du eine gültiges Zip Archiv zu öffen. Beim ersten Backup hast du aber eine Datei die einfach mit File.Create erzeugt wurde. Also keine Zip Datei sondern einfach irgendeine leere Datei. Ein Zip Archiv hat eine interne Verwaltung seine Inhalts die deine Library scheinbar als 'central directory' bezeichnet. Wenn die fehlt -> Bäng. Deine Byte folge mit dem du die Datei erstellst stellt vermutlich eine leere 'central directory' dar. Ich vermute aber mal das deine Library eine eingebaute Methode hat um ein leeres Archiv zu erzeugen. Wie wäre es zum Beispiel mit 'new ZipFile(this.SaveFile)' solange die Datei noch nicht im FileSystem existiert? Wenn du dann das ZipFile schließt denke ich hast du ein gültiges leeres Zip Archiv. Ohne Benutzung einer magischen Bytefolge ;)