Limitierte Dateigröße mit SingleFileDataStorage?
Hallo,
hat jemand Erfahrungen mit SingleFileDataStorage? Ich setze es ein und musste nun festellen, dass die damit erzeugten Dateien - anders als beschrieben - nicht beliebig groß sein können. Einen genaueren Wert muss noch herausfinden, aber die Dateien bei denen es aufgefallen ist (3,8 bis 4 GB) sind korrupt und können nach Erstellung von SFDS selbst nicht gelesen werden, weil MD5-Checks fehlschlagen usw. Die Beschreibung Zitat:
Falls jemand Erfahrungen damit / Ideen dazu hat, sind sie willkommen :) |
AW: Limitierte Dateigröße mit SingleFileDataStorage?
HTFS oder FAT32?
HTFS zwingend erforderlich, ersatzweise auch exFAT. |
AW: Limitierte Dateigröße mit SingleFileDataStorage?
Sind die 4 GB auf die Gesamtdatei bezogen, oder auf eine der Dateien darin?
Bei Gesamtdatei sah es so aus, als wenn es eine Exception geben müsste, wenn man an die Grenzen des Dateisystem (z.B. FAT32) stößt. (kann aber sein, daß ich auf die Schnelle nicht alle Dateizugriffe gesehn hab.) Und welche Delphi-Verison? Im Code wird zwar an vielen Stellen mit AnsiString gearbeitet, aber bei 2007 kann man nicht sicher sein, ob es da nicht doch noch ein paar Bugs gibt. Was gibt denn der Compiler für Meldungen aus? [edit] Vielleicht ist ja hier was Alternatives dabei. http://17slon.com/gp/gp/gpstructuredstorage.htm http://msdn.microsoft.com/en-us/libr...69(VS.85).aspx http://www.delphipraxis.net/176827-v...wendungen.html Ansonsten (falls es nicht auf Geschwindigkeit an kommt) könntest auch eine der Zip-Komponenten verwenden. |
AW: Limitierte Dateigröße mit SingleFileDataStorage?
Zitat:
Zitat:
Zitat:
Ich habe auch eine Delphi 7 Installation da, könnte es damit mal probieren. Da ist die unveränderte Version installiert. Bin jetzt gerade dabei, mich schrittweise an die Größe heranzutasten, ab der die Datei als ungültig erkannt wird. Zitat:
|
AW: Limitierte Dateigröße mit SingleFileDataStorage?
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe mal eine mitgelieferte Demo Basic SFDS File Creator getestet.
Ergebnis: Eine Größe von 3,9 GB wird bei mir nicht überschritten, obwohl mehr Daten drin sein müssten. Siehe Anhang: |
AW: Limitierte Dateigröße mit SingleFileDataStorage?
Hm, wie viel mehr müsste drin sein? Vielleicht die Komprimierung? Sonst würde das ja bedeuten, dass das Tool ab einem bestimmten Wert einfach aufhört die Datei zu schreiben und sie dann selbst als ungültig einstuft... Ich habe hier eine Datei mit der Größe von 4,00 GB (4.298.860.637 Bytes) (erstellt mit meinem Programm, sollte aber die gleiche Funktionalität sein)
|
AW: Limitierte Dateigröße mit SingleFileDataStorage?
Das Ding greift stückchenweise, über einen selbstgebauten Stream, auf die SFDS-Datei zu.
Vermutung: Dort wird irgendwo mit einem "Integer" gearbeitet und größere Positionen werden daher auf 32 Bit abgeschnitten. |
AW: Limitierte Dateigröße mit SingleFileDataStorage?
Zitat:
4,04 GB (4.338.868.224 Bytes) |
AW: Limitierte Dateigröße mit SingleFileDataStorage?
Suche Dir ein anderes Programm aus:
http://en.wikipedia.org/wiki/Compari...file_archivers Ich würde 7-Zip nehmen: http://en.wikipedia.org/wiki/7-Zip |
AW: Limitierte Dateigröße mit SingleFileDataStorage?
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe mal 7-Zip getestet - Free Demo von hier:
http://www.rg-software.de/files/SevenZipVCL_076.zip Macht einen guten Eindruck. Getestet mit WIN8.0 und XE2. NICHT vegessen: 7za.dll in das WINDOWS-Verzeichnis kopieren! Ist im Anhang. Zitat: You will also need the 7za.dll from sourceforge !! Ist im Anhang !! The dll is in the extra.tar.bz2 package. Dll version 4.42 is included in the package. New 0.71: Multivolume support, password support. New 0.72: Fixed 4GB limit, some other bugs ;-) |
AW: Limitierte Dateigröße mit SingleFileDataStorage?
Danke für die Vorschläge,
das mit 7-Zip hatte ich bisher nicht auf dem Radar. Generell ist es gut Alternativen zu haben, wobei ich eine Umstellung möglichst vermeiden würde. Das Ganze wird für die Datensicherung / Datenwiederherstellung eingesetzt... Deswegen habe ich zumindest vorerst nach der Ursache gesucht. Das Seltsame ist, dass eine Datei mit ca. 8 GB erstellt und auch gelesen werden kann. Es wurden testweise 1GB-Dateien erstellt, die einfach mit Nullen gefüllt sind. Damit kommt der Basic SFDS File Creator klar, so wie es aussieht. Dann habe ich weiter getestet und mir eine ca. 70 MB große Datei geschnappt, die mehrfach kopiert, bis das Ergebnis bei über 4 GB lag. Ich habe also den Fall, dass wenn ich eine Kopie lösche, die Sicherung klappt, wenn ich sie wieder hinzufüge, ist das Ergebnis fehlerhaft. Die Dateieinträge kommen ganz am Ende der erstellten Datei. Bei der korrupten Datei sucht sie der Reader anhand der gespeicherten Position an einer Stelle, an der es sie noch nicht gibt, sprich viel zu früh, so dass der Write sich in so einem Fall verhauen und dabei eine Fehlerhafte Position für die Dateieinträge speichern müsste. Also habe ich erstmal beim Write geschaut. Geschrieben werden die Einträge in TSFDSCustomWriter.WriteFileEx. In einer Schleife wird die jeweilige Datei in Chunks (ChunkSize in Höhe von 32KB wird dabei verwendet) geschrieben. Bei einer 70MB Datei sind es ziemlich viele Durchläufe, also habe ich mir da die einzelnen Schritte / Werte ausgeben lassen, um die Stelle zu finden, an der es einen Unterschied. Die letzte Datei der funktionierenden Sicherung bzw. die vorletzte Datei der korrupten Sicherung sind soweit identisch von den Werten her, hier am Beispiel des Schleifendurchlaufs Nr. 146:
Code:
Nach dem Aufruf von "Write" sind die 4GB schon überschritten, aber es funktioniert noch. "SourceStream.Size" ist dabei immer gleich "SourceStream.Position" - sowohl vor "Write" als auch danach. Im Schleifendurchlauf Nr. 147 der korrupten Sicherung, also mit einer weiteren 70 MB Datei, sieht man dann eine Abweichung:
-------------------------------------------------------------
Durchlauf Nr. 146 ------------------------------------------------------------- BytesCopied: 32768 K: 4784128 SourceStream.Size: 4294950087 SourceStream.Position: 4294950087 Write(CopyBuffer^, BytesCopied)... SourceStream.Size: 4295081159 SourceStream.Position: 4295081159
Code:
In "Write(CopyBuffer^, BytesCopied)" wird nach der Zeile "result := Compressor.Write(Buffer, Count);" SourceStream.Position plötzlich zurückgesetzt auf einen viel kleineren Wert, was nach dem oben beschriebenen Problem aussieht. Nur weiß ich nicht so richtig, wieso das passiert...
-------------------------------------------------------------
Durchlauf Nr. 147 ------------------------------------------------------------- BytesCopied: 32768 K: 4816896 SourceStream.Size: 4295081159 SourceStream.Position: 4295081159 Write(CopyBuffer^, BytesCopied)... -> result := Compressor.Write(Buffer, Count); -> SourceStream.Size: 4295081159 -> SourceStream.Position: 113863 <------------- FileSize vorher: 4784128 result: 32768 FileSize nachher: 4816896 |
AW: Limitierte Dateigröße mit SingleFileDataStorage?
Zitat:
|
AW: Limitierte Dateigröße mit SingleFileDataStorage?
Habe mir sowas gedacht. Die Gesamtdatei war 8GB, so dass es schon half festzustellen, dass grundsätzlich größere Dateien möglich sind. Das heißt dann wahrscheinlich, dass der Platz zwar mit 8GB reserviert wurde, aber der eigentliche Inhalt, mit dem sich SFDS auseinandersetzen muss, viel kleiner ist / unter 4GB und es somit funktioniert in dem Fall...
|
AW: Limitierte Dateigröße mit SingleFileDataStorage?
Der Vollständigkeit halber:
Ich habe gestern die Ursache für mein Problem gefunden. Sowas Banales... In der Unit "sfds_zlibex.pas" wurde an einigen Stellen in Abhängigkeit von der bedingten Kompilierung "{$ifdef Version6Plus}" Longint bzw. Int64 verwendet - in meinem Fall Longint, weil die abgefragte Bedingung durch die entsprechende .inc-Datei nicht definiert wurde. Diese .inc-Datei war nicht auf dem aktuellen Stand, sprich es wurden dort nur Delphi Versionen bis 2006 abgefragt und das explizit, nicht sowas wie "{$IF CompilerVersion >= 18.5}". |
AW: Limitierte Dateigröße mit SingleFileDataStorage?
Ich weiss, warum ich diese $ifdef... hasse!
Die Programmierer kommen häufig damit selbst durcheinander. |
AW: Limitierte Dateigröße mit SingleFileDataStorage?
Zitat:
(siehe auch https://code.google.com/p/superobjec...uperobject.pas) Statt einer Warnung "Achtung, unter dieser Compiler-Version nicht getestet!" wird da per Hand jede einzelne Version reingeklopft. Die Zeit zum nachtippen sollte besser in Unit-Tests investiert werden. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:33 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