Sie sind hier: Home > Produkte > Software > Datei-Tools > File-Carrier

Dateien problemlos auf mehrere Datenträger verteilen:

FileCarrier V1.1 - Flexibler Packer mit Freeware-Datenpresse

Das Utility FileCarrier ist das ideale Tool zum Aufteilen und Transportieren großer Dateien oder ganzer Ordner mittels mehrerer Datenträger. Daneben zeigt das Projekt, wie man die Freeware-Packer-DLL zlib problemlos in eigene Utilitys integrieren kann.

Download: ZIP-kompatibles Archiv (1,73 MByte)
für Windows 98/ME/2000/XP
Hilfe und Infos zur Installation finden Sie hier.

Alle Tools und Artikel komplett auf der Tools&More-CD.

Unterstützen Sie Tools&More: Lassen Sie sich registrieren.

Dieses Programm weiterempfehlen.

Wie transportiert man eine Datei von einem PC zu einem anderen? Natürlich mit einer Diskette – sofern kein Netzwerk zur Verfügung steht. Was aber, wenn es sich um ein etwas größeres Winword-Dokument handelt, das zudem ein paar eingebettete Bilder enthält? Das schlägt nämlich leicht mit ein oder zwei MByte zu Buche, die dann nicht mehr so ohne weiteres an einem Stück auf eine Diskette passen. 

Hier gäbe es noch die Möglichkeit, die betreffende Datei mit einem Utility wie Winzip zu packen – bei Textdateien ergeben sich schließlich oft phänomenale Komprimierungsraten. Schafft man es jedoch nicht, die Dateigröße dadurch unter die Kapazitätsgrenze des Zielmedium zu drücken, so hat man ein echtes Problem. Zwar beherrschen fast alle modernen Packer die Aufteilung großer Datenmengen auf mehrere Datenträger. Doch fast immer steht allein die Komprimierung im Vordergrund – die Usability zur Lösung von Alltagsprobleme bleibt dabei jedoch auf der Strecke.

Mehr Komfort durch den FileCarrier
Hier setzt das diesmalige Utility FileCarrier an. Das Programm entspricht zwar in seiner Funktion einem modernen Dateikomprimierer/-dekomprimierer. Von der Konzeption her ist der FileCarrier jedoch genau umgekehrt aufgehängt: Im Vordergrund steht der komfortable Transport beliebiger Dateien und Ordner mittels mehrerer Datenträger. Dass der FileCarrier die Daten dabei auch gleich komprimiert, ist zumindest für die Handhabung des Tools Nebensache. 
Zum Sichern einer oder mehrerer Dateien zieht man deren Namen einfach in die Dateiliste des FileCarriers. 

Dann legt man noch das Sicherungsziel fest, beispielsweise das Diskettenlaufwerk, und vergibt dem zu erstellenden Datensatz einen sinnfälligen Namen. Ein abschließender Klick auf die Schaltfläche Sicherung starten und das Backup beginnt.

Sicherungsoptionen 
Grundsätzlich schreibt der FileCarrier die Daten solange auf das Ziel, bis dieses komplett gefüllt ist. In diesem Fall wird die Sicherung unterbrochen und per Dialog der nächste Datenträger verlangt. Dies wiederholt sich sooft, bis alle Daten übertragen wurden.

Anhand der Optionen auf der gleichnamigen Registerkarte kann zusätzlich noch festgelegt werden, wie groß die einzelnen Datenblöcke maximal werden dürfen. Dadurch hat man beispielsweise die Möglichkeit, einen kompletten Sicherungssatz für Disketten auf Festplatte anzulegen – den man anschließend auch ohne den FileCarrier beliebig oft duplizieren kann. In diesem Fall wäre also eine Blockgröße von rund 1400 KByte einzustellen. Ferner kann in den Optionen noch festgelegt werden, ob das Zielverzeichnis vor der Sicherung zu löschen ist – ein wichtiger Punkt bei Wechselmedien, die öfter mit dem FileCarrier verarbeitet werden.

Wiederherstellung der Daten
Um die Daten am Zielrechner wieder einzulesen, startet man dort den FileCarrier und wählt darin die Registerkarte Lesen. Anhand der Schaltfläche Datenquelle festlegen teilt man dem Utility zunächst mit, von wo die Teilarchive einzulesen sind. Findet der FileCarrier an dieser Stelle ein entsprechendes Archiv, so präsentiert er dessen Namen und aktiviert den Taster Wiederherstellung starten. Ein Klick darauf und die Dateien werden wiederhergestellt. 

Hierfür werden die Archivblöcke nach und nach eingelesen, dekomprimiert und wieder zu einzelnen Dateien gemacht. Reicht ein Archiv über mehrere Datenträger, so wird am Ende des einen jeweils per Dialog nach dem nächsten verlangt.

Trifft der FileCarrier bei der Wiederherstellung einer Datei auf ein gleichnamiges Objekt, so erhält man einen entsprechenden Hinweis. Man kann dann die Datei überschreiben, umbenennen oder auch einfach auslassen. Das Standardverhalten für diesen Fall lässt sich auf der Registerkarte Optionen festlegen. Dort kann man auch definieren, ob der ursprüngliche Verzeichnisbaum komplett wiederaufgebaut werden soll – oder alle Dateien in ein und dem selben Ordner landen sollen.

Zlib – kompakt und schnell
Während der größte Teil des FileCarriers mit Funktionen aus dem Visual-Basic-Repertoire aufgebaut wurde, mußte für die Komprimierung etwas weiter gefasst werden. Denn wer eine adequate Bibliothek hierfür in den Unmengen von Windows-eigenen DLLs vermutet, muss enttäuscht werden. Dagegen bringt ein Blick ins Internet wahre Perlen zum Vorschein. Für die unterschiedlichsten Plattformen findet man dort Kompressionsbibliotheken en masse. Viele davon wurden als Open-Source-Projekte ins Leben gerufen und sind daher Freeware. 

Einer dieser Packungskünstler ist die Bibliothek zlib. Sie ist der ideale Kandidat für eigene Projekte. Denn zlib ist kostenlos, berührt keinerlei Patente, und quasi auf jeder Plattform verfügbar. Letzterer Punkt ist besonders interessant: Dadurch können beispielsweise unter Linux mit zlib gepackte Daten problemlos auch etwa unter Windows wieder entpackt werden – und umgekehrt. 

Die in zlib verwendeten Kompressions-/Dekompressionsmethoden sind zudem recht schnell. Einen Vergleich mit anderen (kommerziellen) Packern braucht ein damit ausgestattetes Programm nicht zu scheuen. Zlib packt etwa so gut wie das aktuelle Winzip mit normaler bzw. maximaler Kompression. Dafür benötigt es aber deutlich weniger Zeit: Je nach Datenzusammensetzung sind Differenzen von 25 % bis 50 % möglich. Beim Entpacken sind die Unterschiede sogar noch deutlicher. 

Wichtig zu wissen ist auch, dass zlib nicht auf der LZW-Kompressionmethode aufsetzt. Diese hat nämlich den Nachteil, dass bei ungünstiger Vorgabe die Daten nicht schrumpfen, sondern gar anwachensen – in Extremfällen auf mehr als das doppelte der ursprünglichen Größe. Trifft zlib auf solch „unverdaulichen“ Daten, so werden die Daten einfach nur gespeichert, anstatt sie großzukomprimieren. Im ungünstigsten Fall macht sich lediglich ein ein Verwaltungs-Overhead von 0,015 % der Ausgangsgröße bemerkbar – dazu gleich mehr.

Auch zlib's Anforderungen an den Arbeitsspeicher können sich sehen lassen. Alles in allem werden für die Komprimierung rund 250 KByte benötigt, für das Entpacken sogar nur knapp 50 KByte. Wem dies für bestimmte Lösungen noch immer zu viel ist, kann die Bibliothek über deren Sourcen entsprechend umkonfigurieren. Allerdings hat ein geringerer Arbeitsspeicher auch direkte Auswirkungen auf die Komprimierungsrate von zlib, die dadurch etwas abnimmt. Zlib wurde von Jean-loup Gailly (Kompression) und Mark Adler (Dekompression) geschieben. Gailly ist unter anderem der Hauptautor des Unix-Tools gzip, welches auf zlib aufbaut. Adler hat ebenfalls an gzip mitgearbeitet, von ihm stammen zudem Programmteile in zip und unzip. 

Die Anwendung von zlib
Programme, die auf zlib zugreifen möchten, sollten die Datei zlib.dll von ihrer Installationsroutine in das Windows-Systemverzeichnis kopieren lassen. Die aktuelle Version 1.1.3 schlägt gerade mal mit 53 Kbyte zu Buche – fällt im Vergleich zu manchem Megabyte-Trum im selben Ordner also kaum auf.

Alles in allem bietet die Bibliothek mehr als ein Dutzend Funktionen, darunter auch solche zum Lesen und Schreiben von .gz-Dateien. Eine Beschreibung im üblichen Sinne gibt es hierzu zwar nicht. Da aber der komplette Quelltext vorliegt, kann man sich im Handumdrehen mittels der Header-Files informieren.

Für unsere Zwecke am interessantesten ist die Funktion compress() und ihr Gegenstück decompress(). Zusammengenommen ergeben sie ein universelles Werkzeug zum Komprimieren bzw. Dekomprimieren beliebiger Datenblöcke: Man übergibt einfach Adresse und Länge zweier Speicherbereiche – und nach dem Aufruf findet man den Inhalt des einen in komprimierter bzw. dekomprimierter Form im anderen vor.
Die Deklaration in Visual Basic ist folgendermaßen vorzunehmen:

Declare Function compress Lib "zlib.dll" (dest As Any, destLen As Any, src As Any, ByVal srcLen As Long) As Long
Declare Function uncompress Lib "zlib.dll" (dest As Any, destLen As Any, src As Any, ByVal srcLen As Long) As Long

In dieser Form können für die Quell- und Zielbereiche (src und dest) sowohl Byte-Arrays als auch Strings verwendet werden. Der Parameter srclen gibt die Größe des Quelldaten in Byte an. Mit dem Wert in destlen informiert man die Funktionen über die Ausmaße des Ergebnispuffers. Letzterer Wert ergibt sich bei der Komprimierung aus der Summe von Ausgangsgröße und Verwaltungs-Overhead. 

Die Ausgangsgröße wird angenommen für den worst case, also den Fall, dass sich die vorliegenden Daten von zlib gar nicht komprimieren lassen. Das passiert beispielsweise, wenn die Daten eine für die verwendete Kompressmethode ungünstige Zusammenstellung haben oder ganz einfach schon komprimiert sind. 

Der Overhead berechnet sich wie folgt: Je 32-KB-Teilblock benötigt zlib 5 Byte für dessen Verwaltung. Hierzu kommen dann nochmals 6 Byte für das Handling des Gesamtblocks. Für die Komprimierung von beispielsweise 100.000 Byte sind also sicherheitshalber maximal 100.026 Byte zu reservieren.

Beim Dekomprimieren ist die Berechnung des Ergebnispuffers einfacher. Dieser muss ganz einfach so groß sein, wie der betreffende Datenblock vor seiner Komprimierung. Wird beim Aufruf von compress() also nicht immer mit der gleichen maximalen Blockgröße gearbeitet, so ist die ursprüngliche Größe, in welcher Weise auch immer, zu sichern.

Nach dem Ausführen von compress() bzw. decompress() werden die Werte für die Größe des Ergebnispuffers, sofern nötig, angepasst. Beim Komprimieren ist dies eigentlich fast immer der Fall, beim Entpacken so gut wie nie – es sei denn, man hat sich bei dem Ausgangswert vertan.
Erhält man von den Funktionen als Rückgabewert eine Null, so gab es bei der Abarbeitung keine Probleme. Werte unter Null zeigen dagegen Fehler an. An dieser Stelle am wichtigsten ist der Wert –5, der auf einen Zielpufferüberlauf hinweist.

Vereinfachte Anwendung 
In den Quelltexten zu diesem Projekt gibt es ein Modul namens zlibinterface.bas, das unter anderem zwei Funktionspaare für den leichteren Zugriff auf compress() bzw. decompress() bietet: Das Paar ZlibCompressString()/ZlibDecompressString() ist für die Verarbeitung von Zeichenketten gedacht. Mit ZlibCompressBinary()/ZlibDecompressBinary() kann man dagegen Byte-Arrays übergeben. 

Der große Vorteil dieser Funktionen besteht darin, dass man nur noch einen einzigen Parameter übergeben muss – nämlich den Puffer mit den zu behandelnden Daten. Das jeweilige Ergebnis wird dann in der gleichen Variablen geliefert. Um beispielsweise die Daten in dem String Zeichenkette zu komprimieren, genügt folgender Aufruf:

rc = ZlibCompressString(Zeichenkette)

Das ist schon alles. Man muss sich also weder um einen Zielpuffer noch dessen Dimensionierung kümmern. Um den komprimierten Text nun wieder auf Normallänge zu bringen, ruft man das entsprechende Pendant in gleicher Manier auf:

rc = ZlibDecompressString(Zeichenkette)

Analoges gilt für die Bearbeitung von Byte-Feldern mittels ZlibCompressBinary() und ZlibDecompressBinary(). Dabei ist es übrigens egal, unter welcher Option Base die Felder angelegt wurden. Der Code in den beiden Funktionen fängt eventuelle Verschiebungen ab. 

Die Rückgabewerte aller vier Funktionen entsprechen übrigens denen von compress() bzw. decompress().

Download
Die Bibliothek zlib ist zwar als DLL im ganz oben genannte Paket schon enthalten. Die Sourcen davon, sowie weiteres interessantes Informationsmaterial hierzu gibt es im Internet auf der zlib-Homepage unter http://www.gzip.org/zlib/.

Top
© 2004 Wirth New Media Sarl
Druckversion