Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Dateien zusammenfügen und später wieder Zerlegen (https://www.delphipraxis.net/186834-dateien-zusammenfuegen-und-spaeter-wieder-zerlegen.html)

muhael 5. Okt 2015 10:34

Delphi-Version: 7

Dateien zusammenfügen und später wieder Zerlegen
 
Hallo meine Lieben Delphianer!

Zu meinem Programm:
Ich habe einen Updater der von einem FTP Server die benötigten Dateien herunterlädt und speichert (IndyFTP) nun sind aber über die Zeit relativ viele und auch viele kleine Dateien Hinzugekommen.
Nun gibt es ja das Phänomen wenn man viele kleine Dateien Runterläd, kopiert o.ä. das sich der ganze Vorgang dadurch drastisch in die Länge zieht.

Meine Idee: die ganzen kleinen Dateien zu einer zusammenzufügen (Nein ich möchte bzw kann nicht Abbrevia, Zlib, Jedis oder ZipMaster verwenden da ich diese nicht installieren kann oder geschweige nach der Installation benutzen kann :( ). außerdem ist die kommpression bei solch kleinen Dateien viel zu gering damit das irgendwas aus macht.
Nun habe ich schon ein wenig zu Streams gelesen und ein wenig Code http://www.delphipraxis.net/154806-datei-datei-anhaengen.html gefunden.

Nun muss ich das auf meine Dateien anwenden und auch auf die Masse der Dateien. Dazu müssten eventuell noch die Dateinamen in den "Header". aber es gibt für den Updater eine Update.txt wo drin steht wie die Datei Heißt also denke nicht notwendig oder?

meine Funktion sieht z.Z so aus und meine Fragen lauten.
1.) wie muss ich die Dateien(TStrings) in den Stream einbinden?
2.) wie neben der Länge noch den Namen Speichern?
3.) wie lese ich die Daten wieder aus? :shock:

sorry wegen den Fragen ist das erste mal mit Streams :oops:

Delphi-Quellcode:
Function Writedata(Files:TStrings; Filename:string):boolean;
  Var lStream  : TStream;
      lStartPos : Int64;
      lDataSize : Cardinal;
      i        : Integer;
begin
  lStream := TFileStream.Create(Filename, fmCreate);
  try
    lStartPos := 0;
    lStream.Position := lStream.Position + sizeof(lDataSize);
    for i := 0 to Files.Count-1 do begin
      // Lade Dateien
      // In STream Speichern...
      lDataSize := lStream.Position - lStartPos - sizeof(lDataSize);
      lStream.Position := lStartPos;
      lStream.Write(lDataSize, sizeof(lDataSize));
      // wie die endung speichern?
    end;
    Result := true;
  except
    Result := False;
  end;
end;
LG muhael

haentschman 5. Okt 2015 10:38

AW: Dateien zusammenfügen und später wieder Zerlegen
 
Hallo...:P
Zitat:

Nein ich möchte bzw kann nicht Abbrevia, Zlib, Jedis oder ZipMaster verwenden da ich diese nicht installieren kann oder geschweige nach der Installation benutzen kann
Kannst du die Begründung mal ein wenig ausführlicher machen? Ich denke das es vielen mit dem Verständnis so geht wie mir...Unverständnis, da z.B. ZIP in so einem Falle ein gebräuchliches Mittel ist. 8-)

muhael 5. Okt 2015 10:43

AW: Dateien zusammenfügen und später wieder Zerlegen
 
also ich wollte es mit Zip machen bei Zlib sowie Zipmaster kann ich die Komponenten nach der installation nicht verwenden da das package nciht gefunden wird(ES IST ABER DA O_O) und abbrevia lässt sich nciht installieren ka warum es will einfach nicht :(

muhael 5. Okt 2015 10:53

AW: Dateien zusammenfügen und später wieder Zerlegen
 
bzw Zlib nimmt nur eine Datei und komprimiert diese meiner Kenntniss nach, korrigiere mich wenn ich falsch liege :/

haentschman 5. Okt 2015 10:54

AW: Dateien zusammenfügen und später wieder Zerlegen
 
Ahhh... 8-)
Es ist also prinzipiell möglich auch ZIP zu benutzen. Es scheitert nur an der Verfügbarkeit einer Komponente. Imho wäre es am einfachsten wenn wir dir helfen die ZIP Komponente ans Laufen zu bekommen. Damit hast du dann am wenigsten Streß auf beiden Seiten. Das ZIP liegt ja schon fertig auf dem Server. Du mußt es dann nur noch nach dem Download auspacken.
Gib uns mal ein wenig mehr Info´s zu deinem System: Delphi Version, welche Komponenten in welchen Versionen du probiert hast. Wie du die "Installation" probiert hast. Vieleicht stoßen wir ja auf einen Flüchtigkeitsfehler und das Kind ist geschaukelt. :thumb:

muhael 5. Okt 2015 10:58

AW: Dateien zusammenfügen und später wieder Zerlegen
 
okay :) benutze Delphi 7 Enterprise
habe Zipmaster über die Setup.exe installieren lassen (sollte auch noch installiert sein)
Zlib kaum ausprobiert wegen nur einer Datei :/
und abbrevia hab ich die 5.0 versucht da ist es aber bei der installation gescheitert was genau weiß ich nicht mehr glaube da hat was gefehlt in dem Ordner

haentschman 5. Okt 2015 11:19

AW: Dateien zusammenfügen und später wieder Zerlegen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ok,

versuche mal TZip im Anhang. Klein aber fein.

1. Components.zip entpacken
2. Neues Package -> Name "MyZip" zum Bleistift.
3. alle PAS hinzufügen.
4. Erzeugen
5. Installieren
6. Hilfe lesen + Beispiele gucken :thumb:
7. Die DLL´s aus DLLs.zip liegen dann im Programm Ordner

nahpets 5. Okt 2015 11:21

AW: Dateien zusammenfügen und später wieder Zerlegen
 
Hallo,

zu ZipMaster:

Die Quelltexte befinden sich in irgendeinem Verzeichnis.
Bei mir ist es \Delphi\Komponenten\ZipMaster.

Suche bitte bei Dir das entsprechende Verzeichnis.

Dort findest Du dann ein Unterverzeichnis "Packages".

Darin sollte eine Datei mit der Dateiendung ".dpk" zu finden sein, aus deren Namen sich ergibt, dass sie für Delphi 7 gedacht ist.

Die ist bei mir die Datei "ZMstr191D7.dpk".

Diese Datei öffnest Du bitte mit Delphi (Datei -> Projekt öffnen), im Dateiauswahldialog die Dateiendung ggfls. auf .dpk ändern.

Dann betätigst Du den Button "Compilieren" (oder halt Strg+F9).

Anschließend betätigst Du den Button "Installieren".

Eventuell musst Du in den Projektoptionen noch die Suchpfade anpassen, aber dies ist nur erforderlich, wenn beim Kompilieren entsprechende Fehlermeldungen erscheinen.

Wenns dabei Probleme gibt, bitte hier die Fehlermeldungen posten und weiterfragen.

muhael 5. Okt 2015 11:29

AW: Dateien zusammenfügen und später wieder Zerlegen
 
da müsste ich die dll´s mitliefern oder?

wäre nicht so toll^^ da es auch einen installer gibt der das progg eig auf die aktuellste Version patcht gleich :/

muhael 5. Okt 2015 11:34

AW: Dateien zusammenfügen und später wieder Zerlegen
 
[Fatal Error] zipdemo2.dpr(50): File not found: 'ZipMstr.dcu'
Meh hab soweit compiliert und installiert hat gefunzt beim starten einer Demo dann der fehler hier

haentschman 5. Okt 2015 11:42

AW: Dateien zusammenfügen und später wieder Zerlegen
 
Zitat:

Zitat von muhael (Beitrag 1317702)
da müsste ich die dll´s mitliefern oder?

wäre nicht so toll^^ da es auch einen installer gibt der das progg eig auf die aktuellste Version patcht gleich :/

Welches konkrete Problem siehst du darin? Der Installer legt die Dateien ab und fertsch...8-)

nahpets 5. Okt 2015 11:44

AW: Dateien zusammenfügen und später wieder Zerlegen
 
Also versuchen wir zuerst einmal ein allgemeine Klärung der Aufgabenstellung:

Du möchtest eine (beliebig)große Menge von mehr oder wenig großen Dateien per FTP "verteilen" und zwar ausschließlich mit Deinem Programm ohne Nutzung von fremden Komponenten, die bei der Auslieferung Deiner Software weitere Dateien, DLLs... benötigen.

Dein Programm aoll also ausschließlich aus Deiner EXE bestehen?

Da Du ja die Indykomponenten nutzt, schau die mal TIdMessage an und dort MessageParts. Mit Add kannst Du dort Anhänge verwalten.

Als Ergebnis entsteht eine mehr oder weniger großer Text, den Du ja nicht per EMail verschicken musst, sondern per FTP als Datei kopieren kannst.

Um an die einzelnen Dateien zu kommen, musst Du dann die Anhänge wieder aus den Messageparts herausholen.

Da das Ganze "mailkonform" kodiert wird, muss Du mit einem nicht unerheblichen Zuwachs bei dem insgesamt benötigten Speicherbedarf rechnen.

nahpets 5. Okt 2015 11:47

AW: Dateien zusammenfügen und später wieder Zerlegen
 
Zitat:

Zitat von muhael (Beitrag 1317703)
[Fatal Error] zipdemo2.dpr(50): File not found: 'ZipMstr.dcu'
Meh hab soweit compiliert und installiert hat gefunzt beim starten einer Demo dann der fehler hier

Dann schau doch mal nach, wo beim Kompilieren des Packages die DCUs abgelegt wurden und füge die "Fundstelle" in den Projektoptionen in den entsprechenden Suchpfad mit ein, alternativ füge des Verzeichnis der ZIPMaster-Quelltexte in den Suchpfad mit ein.

haentschman 5. Okt 2015 11:52

AW: Dateien zusammenfügen und später wieder Zerlegen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Beim ZipMaster brauchst du genauso diese 2 DLL...
Zitat:

// Component TZip Component .
// Version: 1.4 .
// Date: 6 April 2003 .
// Compilers: Delphi 3 - Delphi 7. .
// Author: Angus Johnson - angusj-AT-myrealbox-DOT-com .
// Copyright: © 2001-2003 Angus Johnson .
// .
// Description: Delphi interface to the ZipDll.dll & UnzDll.dll libraries .
// created by Eric W. Engler and Chris Vleghert. (SFX .
// support is provided but not as part of this component.) .
// .
// Acknowledgements: Based on the TZipMstr component which was created by .
// Eric W. Engler and Chris Vleghert.
... TZip ist ein erweiterter Wrapper um die DLL´s

Nachtrag:
Beim Suchen gefunden: Entpacken ohne DLL´s (Anhang: entpack.zip) Ich habe mal in die pas geguckt. Mich schüttelt es immer noch bezüglich der Formatierung. :P Funktionalität...???

BUG 5. Okt 2015 12:12

AW: Dateien zusammenfügen und später wieder Zerlegen
 
Wenn du Zip nehmen kannst, würde ich Zip nehmen, da du z.B. keine exotischen Werkzeuge brauchst um mit Zip-Dateien zu arbeiten.
Ansonsten kannst du jedes beliebige Archiveformat nehmen. Normalerweise rate ich bei so etwas immer, sich das jeweilige Unix-Tool anzuschauen, aber tar ist eher schrecklich. Ein Vorteil hätte es aber: Wenn du erst archivierst und dann komprimierst, hast du vielleicht auch bei den kleinen Dateien mehr Erfolg.

haentschman 5. Okt 2015 12:18

AW: Dateien zusammenfügen und später wieder Zerlegen
 
Zitat:

Wenn du erst archivierst und dann komprimierst, hast du vielleicht auch bei den kleinen Dateien mehr Erfolg.
Hier geht es noch nicht einmal um die Kompressionsrate sondern um die Zusammenfassung vieler kleiner Dateien welche beim Download bekanntermaßen die Geschwindigkeit drücken.

samso 5. Okt 2015 14:23

AW: Dateien zusammenfügen und später wieder Zerlegen
 
Wenn man Dateien nur zusammenkleben will, ohne sie zu komprimieren, dann ist das üblich Standardverfahren dazu "tar". Dabei werden dann aber pro Datei nochmal zusätzlich 512 Byte für den Header gespeichert (s.a. Tar Fileformat). Dazu gibt es auch eine Delphi-Lib:

libtar

hathor 5. Okt 2015 16:52

AW: Dateien zusammenfügen und später wieder Zerlegen
 
Wird nicht sowieso alles komprimiert übertragen?
https://en.wikipedia.org/wiki/HTTP_compression
http://www.webreference.com/internet...ion/index.html
https://chrome.google.com/webstore/d...dhmmmpeeaebmep
.
https://de.wikipedia.org/wiki/Zopfli
https://github.com/google/zopfli

HolgerX 5. Okt 2015 19:59

AW: Dateien zusammenfügen und später wieder Zerlegen
 
Hmm..

Wieso nutzt Ihr nicht die bei Delphi mitgelieferte ZLIB.pas?

In Kombination mit

SciZipFile.pas

http://cc.embarcadero.com/item/21894
http://www.snehovapohotovost.cz/authorsmore.php?id=1058

Können ganz einfach normale Zip-Archive erstellt werden, welche mit Winzip und co geöffnet werden können.

Alles ohne externe DLL, komplett in der EXE.

Bei

http://zlib.net/

gibt es auch gleich ein Update.

muhael 6. Okt 2015 09:08

AW: Dateien zusammenfügen und später wieder Zerlegen
 
Hey danke für die Vielen vorschläge :)

Hab mich für die Tar Variante entschieden scheint mir die simpelste zu sein und die die bisher am besten funktioniert!

DANKE

muhael 6. Okt 2015 14:47

AW: Dateien zusammenfügen und später wieder Zerlegen
 
Jetzt hab ich zur LibTar nochmal ne Frage...
Habe aus den kleinen dateien eine .Tar datei gemacht.
nun läd mein Installer/updater diese Datei in einen tmp ordner mit einer install/update.txt datei.
im weiteren Verlauf geht mein prog die txt datei durch in der steht Welche Datei in der Tar Extrahiert werden soll und wohin sie muss:
in der datei steht das so da "Extract;Hintergrund.bmp;data/gfx/Hintergrund.bmp
mein prog liest die datei und findet Extract heißt für das prog ich geh in die Extract routine.. dort soll es nach der "Hintergrund.bmp" datei in der tar suchen und diese dann an den gegeben Ort Extrahieren.
Meine Frage ist jetzt wie geht das am besten?
Ich werde aus der Demo von LibTar nicht schlau die verwenden eine Listview und bei mir soll es ja im hintergrund passieren :roll: ....

samso 6. Okt 2015 15:41

AW: Dateien zusammenfügen und später wieder Zerlegen
 
Der wahlfreie Zugriff auf einzelne Dateien ist bei tar nicht möglich. Deshalb muss das (Band-)Archiv immer wieder vom Anfang durchgespult werden, bis man bei der richtigen Datei angekommen ist.

Grob etwa so:
Delphi-Quellcode:
function ExtractFileFromTar(const Name, Zielpfad: String);
begin
  tar.reset;
  Found := False;
  while not Found and tar.FindNext(DirRec) do
  begin
    if SameText(String(DirRec.Name),Name) then
      Found := True;
  end;
  if Found then
    tar.ReadFile(Zielpfad + Name);
end
Einige Feinheit müssen noch erledigt werden: Tar-Instanz erzeugen, Fehlerbehandlung, falls Pfade in dem tar-Archive vorkommen muss das berücksichtigt werden...


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:30 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz