Autor Beitrag
abstractvoid
Hält's aus hier
Beiträge: 1



BeitragVerfasst: Mo 17.03.08 16:10 
Hallo Leute,

Ich bin neu hier und das ist mein erstr Post. Ich habe ein Problem. Und zwar will ich mit SharpZipLib nicht einen Ordner zippen, das habe ich schon hinbekommen, sondern eine Liste von Dateien. Ich habe eine Methode, die mir eine Liste von den nötigen Datei-Objekten generiert. Diese haben 3 Werte (Name, Pfad und HashWert). Bei Bedarf kann ich weitere hinzufügen. Jetzt möchte ich anhand einer Liste eine neue .Zip Datei erstellen, die die nötigen Dateien in der richtigen Ordnerstruktur beinhaltet. Das sehe in etwa folgendermaßen aus:

DateiListe
---------------------------------
| Datei1.txt
| D:\Test
| HierstehtderHashWert
---------------------------------
| Datei2.txt
| D:\Test\SubDir
| HierstehtderHashWert
---------------------------------
| Datei3.txt
| D:\Test\SubDir\SubDir2
| HierstehtderHashWert
---------------------------------

Nach vielen fehlgeschlagenen Versuchen wollte ich mein Problem hier präsentieren, in der Hoffnung auf eine Lösung.

Diesen Code verwende ich, um einen Ordner samt Unterordner zu zippen:

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:
34:
35:
36:
37:
38:
39:
40:
// DateiPfad ist die zu erstellende .Zip datei, Verzeichnis, das Verzeichnis, welches gezipped werden soll
public void Zippe(string DateiPfad, string Verzeichnis)
        {
            try
            {
                ZipOutputStream ZOS = new ZipOutputStream(File.Create(DateiPfad));
                ZOS.SetLevel(1);
                DirectoryInfo maindir = new DirectoryInfo(Verzeichnis);
                string parentPath = maindir.Parent.FullName + @"\";
                GoSubdirs(ref ZOS, Verzeichnis, parentPath);
                ZOS.Close();
                MessageBox.Show("Die .Zip Datei wurde erfolgreich erstellt.");
            }
            catch (Exception exc)
            {
                MessageBox.Show(exc.ToString());
            }

        }

        private void GoSubdirs(ref ZipOutputStream s, string path, string parentPath)
        {
            DirectoryInfo dir = new DirectoryInfo(path);
            foreach (DirectoryInfo subdir in dir.GetDirectories())
            {
                GoSubdirs(ref s, subdir.FullName, parentPath);
            }
            foreach (FileInfo fi in dir.GetFiles())
            {
                FileStream fs = File.OpenRead(fi.FullName);

                byte[] buffer = new byte[fs.Length];
                fs.Read(buffer, 0, buffer.Length);
                ZipEntry entry = new ZipEntry(dir.FullName.Replace(parentPath, "") + "/" + fi.Name);
                entry.Size = fs.Length;
                fs.Close();
                s.PutNextEntry(entry);
                s.Write(buffer, 0, buffer.Length);
            }
        }


Das funktioniert auch. Leider schaffe ich es nicht, dass der mir Dateien, die ich ihm in einer Liste gebe, alle in das selbe Archiv zipped. Ich habe versucht seit mehreren Tagen das problem selber zu lösen, aber ich schaffe es einfach nicht. Ich sollte auch erwähnen, dass ich erst seit wenigen Wochen mit C# arbeite. Vielleicht gibt es ja eine einfache Lösung, die ich selber nicht finde. In dem Fall wäre ich euch dankbar, wenn ihr mir zumindest einen Hinweis oder so geben könntet. Schon mal Danke im Voraus.


Moderiert von user profile iconChristian S.: Topic aus C# - Die Sprache verschoben am Mo 17.03.2008 um 15:29
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mo 17.03.08 17:38 
Du brauchst doch nur deine Liste durchgehen und aus jeder Datei dann ein FileInfo erstellen und dann genauso verfahren wie bei den Ordner-Dateien:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
foreach(FileObject f in FileObjects) // oder wie auch immer deine Struktur und Liste heißt
{
  FileInfo fi = new FileInfo(Path.Combine(f.Path, f.File)); // anpassen !!!

  FileStream fs = File.OpenRead(fi.FullName);

  byte[] buffer = new byte[fs.Length];
  fs.Read(buffer, 0, buffer.Length);
  ZipEntry entry = new ZipEntry(fi.Name);
  entry.Size = fs.Length;
  fs.Close();
  s.PutNextEntry(entry);
  s.Write(buffer, 0, buffer.Length);
}
christherdnn
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Mi 18.03.09 16:58 
Hallo Abstrovoid,
ich bin auch ganz neu hier und habe deine Anfrage gelesen, das finde ich Interressant, da ich versuche mit der SharZipLib eine .txt Datei zu zippen und weiss nicht genau wie das geth, könntest du mir vielleicht helfen?
Danke im voraus.
Hermann