Autor Beitrag
Cosmic
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 63



BeitragVerfasst: Fr 20.12.02 16:56 
Hi Ihr!

Nun habe ich doch alle sieben Seiten in diesem Forum durchgelesen, um meiner Idee auf die schliche zu kommen!
So wie es aussieht kann mann mehere Dateien nur in Filestreams speichern, oder?
Ich habe nämlich einen Ordner in dem weitere sechs Ordner mit je sechs Paradoxtabellen (lauten alle auch noch gleich) gespeichert sind.
Das zu speicher habe ich hinbekommen!
Jetzt wärs aber toll wenn man nur eine Datei belieber Endung (*.XYZ) sehen würde, aber die Verzeichnisstruktur erhalten bleibt. Wer sich die *.Pk3 Dateien bei Quake3 mal anschaut weis ungefähr was ich meine. Das sind glaube ich verkapte Zipfiles... Kann man das Verzeichnis vielleicht vor dem endgültigen Speichern zippen, und beim Öffnen entzippen? Geht sowas? Evt. mit PKunzip?! oder hat Delphi sowas integriert?
Denn wenn ich das speichere und später öffnen will kann ich ja leider nicht das Verzeichnis wählen und komplett kopieren, weil der OpenDialog eine Datei haben will und kein Verzeichnis.

Eine Menge Fragen und so wenig Zeit...
Wer ne Idee hat ist herzlichst aufgefordert sie zu posten :)
Danke Ciao Cosmic

-----------------------------------------
Let´s Fetz heute beginnt Dein Leben
tommie-lie
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 4373

Ubuntu 7.10 "Gutsy Gibbon"

BeitragVerfasst: Sa 21.12.02 13:16 
warum so umständlich mit packen?
Wenn du eh einen Filestream hast, brauchst du ja auch die Länge und Position der einzelnen Dateien in diesem Stream. Also brauchst du schon MEta-Informationen. Am einfachsten ließe sich dein Problem dann mit einer Header-Struktur lössen. Du schreibst dazu einfach am Beginn des Streams die Daten:
ausblenden Quelltext
1:
Datei1.ext 200 134 data\base\dir					

Wie du merkst, ist das erste Wort der Dateiname (bis zum Leerzeichen ist ein Wort, sonst hätte ich Word geschrieben was hier aber nicht sinnvoll wäre). Das zweite ist die Länge der Datei, das dritte die Position im Stream, und das vierte, daß ist die neue Info, nämlich der relative Verzeichnispfad. Das war's schon. Am Anfang liest du nun den Header aus (evtl vorher speichern, wie lang er ist, damit du nicht den ersten TEil der Datei miterwischst), auswerten, Dateien lesen und in das richtige Unterverzeichnis schreiben. Nix mit packen. Das ließe sich optimieren, indem du binär speicherst und keine Strings für die Zahlen verwendest und der Geschwindigkeit halber auch noch die Länge der Strings speicherst. Dazu habe ich hier im Forum irgendwo mal (ich glaube es war unter Sonstiges) einen Streit angefangen.
Wenn du aber packen willst, würde ich's genauso machen wie oben mit dem Header, und nur packen damit die Dateien kleiner werden. Dafür bietet sich die zLib an, die bei Delphi ab 6 dabei ist und auf dem InfoZIP-Algorithmus basiert. Oder, wenn du noch stärker komprimieren willst, die BZip2-Unit, die ich mal bei Torry gefunden habe (einfach nach BZip2 oder BZ2 suchen, ist von Edison mera Ménendez (Edmera)). Beide basieren auf dem Stream-im-Stream-Prinzip und packen direkt in einen Stream rein. Du öffnest also einen Filestream mit der Zieldatei, öffnest dann einen (BZ)Compression-Stream und speicherst dann in den Compression-Stream. Entpacken natürlich umgekehrt, aus dem (BZ)DeCompression-Stream lesen.

_________________
Your computer is designed to become slower and more unreliable over time, so you have to upgrade. But if you'd like some false hope, I can tell you how to defragment your disk. - Dilbert


Zuletzt bearbeitet von tommie-lie am Sa 21.12.02 14:45, insgesamt 1-mal bearbeitet
Cosmic Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 63



BeitragVerfasst: Sa 21.12.02 13:51 
Titel: Wow
Hallo,
wow das ist ja eine ausführliche Antwort! Danke.
Aber einen Stream habe ich eigentlich noch gar nicht.
Doch wenn Du meinst das dies die einfachste Möglichkeit ist suche ich mal ein paar gute Tutorials und mache es damit :) Das klang im Forum nur so kompliziert mit dem Filestream... Die Sache mit der Länge der Datei und dem Ort im Stream habe ich schon bei den anderen Beispielen nicht so 100%ig verstanden :( Aber wenn Dein Code alles ist , dann sollte ich das wohl hinkriegen.

++++++++
NUR: Wo gibts die Hilfe in Delphi zu "Filestreams" ? Läuft das unter Filerec?
++++++++

Ciao Cosmic

-----------------------------------------
Let´s Fetz heute beginnt Dein Leben
BungeeBug
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 901



BeitragVerfasst: Sa 21.12.02 14:41 
also wenn du nur infos zu FileStreams haben willst schau mal unter www.delphi-source.de oder (auch wenn der ruf noch so schlecht ist) in die Online Hilfe ...

MfG BungeeBug
tommie-lie
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 4373

Ubuntu 7.10 "Gutsy Gibbon"

BeitragVerfasst: Sa 21.12.02 14:43 
nichts zu danken. da ich sowas auch schonmal machen wollte, hatte ich die Infos ja schon. Außerdem gehören ausfürhliche Antworten zu ausführlichen Fragen einfach dazu, vor allem wenn man weiß, wovon man spricht.

Zum Versttändnis der Position:
Ein Stream ist eine einzige Datei. Fängt vorne an, hört hinten auf.
Wenn du mehrere Dateien in einem Stream zusammenfast, musst du wissen, wo die Dateien liegen, denn es ist ja eine Datei. Es wäre so, als ob du Bücher aneinanderkleben würdest. Du wüsstest nicht, auf welcher Seite das erste Buch aufhört, und das nächste anfängt. Seitenzahlen sind im Stream Bytezahlen. 5 Dateien à 10 Byte lassen sich in einem Stream zu 50 Byte zusammenfassen. Die erste Datei geht von Byte0 bis Byte 4, die zweite von 5 bis 9, 10-14, 15-19 usw.
Jetzt gibt es zwei Möglichkeiten. Entweder Start- und Endpunkt zu speichern, oder Startpunkt und Läne. Letzteres bietet sich an, da die Read-Funktion des Streams (siehe Hilfe) x Bytes einliest, nicht bis Position x.
Es wäre also im Beispiel: 0;5 - 5;5 - 10;5 usw. Also jedesmal Startpos, Länge. Im Stream ist's sogar noch einfacher, da man beim Lesen von 5 Bytes, auch 5 Bytes weiter in der Datei ist. Ist man bei Position 0 und liest 5 Bytes, ist man dannach bei Byte 5. Also ließe es sich machen, daß man nur den Startpunkt der ersten Datei (hinter dem Header) speichert, und dannach nur noch die Längen der Datei.
Jetzt klarer, wozu man sowas machen muss? Es ist wie eine Stadtplan. Ganz viele Häuser nebeneinander, aber nur mit dem stadtplan weist du, weleches Haus wo ist.

Du kannst natürlich auch "normale" Textdateien nehmen, die lassen sich aber nicht direkt komprimieren (nur über einen externen Packer oder indem du die Datei einliest (in einen Stream) packst und dannach wieder schreibst. Streams lassen sich IMO auch leichter handhaben.

In der Hilfe findest du die Streams entweder, indem du im Codeeditor TFileStream eingibst, mit dem Cursor draufgehst und F1 drückst, im Inhalt bei der VCL-Reference, im "by Unit"-Listing in der Unit "Classes", oder im Delpgi-DG auf Seite 3-55 (entspricht Seite 97 von 1140 im PDF). Die angaben (insbesondere die Seitenzahlen) beziehen sich auf Delphi6 PE, da ich nicht weiß, wie Borland in Version 7 das Handbuch umgeschrieben hat.

_________________
Your computer is designed to become slower and more unreliable over time, so you have to upgrade. But if you'd like some false hope, I can tell you how to defragment your disk. - Dilbert
Cosmic Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 63



BeitragVerfasst: Sa 21.12.02 15:58 
Titel: Gute Lösung.
Hi,
jetzt ist mir einiges klarer. Danke :-)

Nur was ist wenn die Länge varriert? und 5 bytes nicht reichen? Ich kann also alle Dateinen einzeln einlesen? Die Ordnerstruktur müste dann manuell beim erstellen angelegt werden? Das klingt für mich nicht so einfach...

Zur Not verzichte ich auf das "in eine Datei schreiben" wie gesagt der einzige Grund ist der das der Nutzer das nicht sehen soll. JA und beim laden der Daten gibts Probleme, weil beim speichern ein Ordner mit Unterordnern gespeichert wird. Beim öffnen finde ich keine Möglichkeit einen ordner als ganzes zu laden.

Dann grüble ich weiter darüber nach :-)

Ciao Cosmic
-----------------------------------------
Let´s Fetz heute beginnt Dein Leben
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 21.12.02 16:19 
Man könnte natürlcih auch die ZLib-Bibliothek nehmen. Müßte irgendwo auf den Delphi CD's zu finden sein. Oder alternativ eine andere freie Pack-Kompo vbon Torry oder so.
Cosmic Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 63



BeitragVerfasst: Sa 21.12.02 17:24 
Titel: Ausprobiert
Hi @ all,
also ich habe das jetzt mal ausprobiert.
Und zwar das mit dem Stream bzw Zlib (hat ja etwas miteinander zu tun, denn Zlib nutzt ja auch TFilestream!). Das klappt ja auch mit einer Datei. Nur es kann nicht sein das ich 36 Dateien in 6 Verzeichnissen manuell eintippen soll? Oder bin ich irgendwie zu blöd dazu. Das Zlib zum Beispiel müste doch auch ganze Ordner erfassen können! In Windows kann ich ja auch ganz einfach mit Winrar einen Ordner Zippen! Vor allem in Hinsicht auf evt Erweiterungen, ist ein einzelnes Einlesen der Dateien unpraktisch! Man stelle sich vor es kommen 6 weitere Verzeichnisse mit Werten hinzu, dann müste ich ja alle Dateien dort einzeln in den Stream packen :(

Machts gut, ein immer verzweifelterer Cosmic......

-----------------------------------------
Let´s Fetz heute beginnt Dein Leben
tommie-lie
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 4373

Ubuntu 7.10 "Gutsy Gibbon"

BeitragVerfasst: Sa 21.12.02 20:36 
wohl dem, der lesen kann, Luckie:
tommie-lie hat folgendes geschrieben:

Dafür bietet sich die zLib an, die bei Delphi ab 6 dabei ist und auf dem InfoZIP-Algorithmus basiert.


Mehrere Dateien unterschiedlicher Länge sind kein Problem. Einfach die echte Länge der Datei speichern, nicht 5. Du speicherst ja eh die Länge für jede Datei neu, also ist das kein Problem.
Hier bei AUQ findest du bei den FAQ auch eine Funktion, die das rekursive einlesen aller Dateien eines Verzeichnisses erlaubt. Damit ließen sich alle Dateien in einem Verzeichnis, samt Unterverzeichnissen ermitteln. Die Beispielfunktion ließe sich durch eine Abfrage der Extension (nur Dateien mit .XYZ) und des Namens beliebig erweitern, aber auf das Durchsuchen der Unterverzeichnisse kommt es an. Die kannst du verwenden um alle Dateinamen ausfindig zu machen und dann jede Datei schreiben (ebenfalls mit Schleife, die in der Liste oben anfängt und utnen aufhört).

_________________
Your computer is designed to become slower and more unreliable over time, so you have to upgrade. But if you'd like some false hope, I can tell you how to defragment your disk. - Dilbert
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 21.12.02 23:37 
@tommie-lie: Ach manno. Wer liest sich schon Beiträge durch, die mehr als 5 Zeilen haben. :roll:
Sorry, habe ich überlesen. :oops:
tommie-lie
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 4373

Ubuntu 7.10 "Gutsy Gibbon"

BeitragVerfasst: So 22.12.02 11:16 
:-P
Jetzt weiß ich auf jeden fall, daß ich auf deine Fragen keine ausführlichen Antowrrten geben darf :lol:

_________________
Your computer is designed to become slower and more unreliable over time, so you have to upgrade. But if you'd like some false hope, I can tell you how to defragment your disk. - Dilbert
Cosmic Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 63



BeitragVerfasst: Mo 23.12.02 19:41 
Titel: Zipprogramm
Hallo,
lucki meinte auf Torry´s Page gäbe es ein paar pack komponenten. Das stimmt , aber ich bin ewas überfordert ein passendes zu finden.
Ich habe schon einige runtergeladen, aber ich komme nicht zurecht damit.
Kennt jemand eine zuverlässige Komponennte?
Die einfach zu nutzen ist?

Danke Ciao Cosmic

------------------------------------------
Let´s Fetz heute beginnt Dein Leben