Autor Beitrag
Raven280438
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 99



BeitragVerfasst: Fr 22.07.11 10:33 
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:
ausblenden 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
ausblenden volle Höhe 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Fr 22.07.11 12:40 
Hallo,

existiert vielleicht der Ordner, in der die Datei SaveFile liegt, noch nicht?
Raven280438 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 99



BeitragVerfasst: 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:
ausblenden 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?

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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 ;)