AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Limitierte Dateigröße mit SingleFileDataStorage?
Thema durchsuchen
Ansicht
Themen-Optionen

Limitierte Dateigröße mit SingleFileDataStorage?

Ein Thema von shadowman · begonnen am 24. Okt 2014 · letzter Beitrag vom 28. Okt 2014
Antwort Antwort
shadowman

Registriert seit: 1. Nov 2005
48 Beiträge
 
#1

AW: Limitierte Dateigröße mit SingleFileDataStorage?

  Alt 24. Okt 2014, 12:53
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)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.531 Beiträge
 
Delphi 12 Athens
 
#2

AW: Limitierte Dateigröße mit SingleFileDataStorage?

  Alt 24. Okt 2014, 13:08
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.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
hathor
(Gast)

n/a Beiträge
 
#3

AW: Limitierte Dateigröße mit SingleFileDataStorage?

  Alt 24. Okt 2014, 13:37
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)

4,04 GB (4.338.868.224 Bytes)

Geändert von hathor (24. Okt 2014 um 13:39 Uhr)
  Mit Zitat antworten Zitat
hathor
(Gast)

n/a Beiträge
 
#4

AW: Limitierte Dateigröße mit SingleFileDataStorage?

  Alt 25. Okt 2014, 07:46
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
  Mit Zitat antworten Zitat
hathor
(Gast)

n/a Beiträge
 
#5

AW: Limitierte Dateigröße mit SingleFileDataStorage?

  Alt 25. Okt 2014, 16:30
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
Angehängte Dateien
Dateityp: zip 7za.zip (134,0 KB, 9x aufgerufen)
  Mit Zitat antworten Zitat
shadowman

Registriert seit: 1. Nov 2005
48 Beiträge
 
#6

AW: Limitierte Dateigröße mit SingleFileDataStorage?

  Alt 27. Okt 2014, 09:52
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:
-------------------------------------------------------------
Durchlauf Nr. 146
-------------------------------------------------------------
BytesCopied: 32768
K: 4784128
SourceStream.Size:       4294950087
SourceStream.Position:    4294950087
Write(CopyBuffer^, BytesCopied)...
SourceStream.Size:       4295081159
SourceStream.Position:    4295081159
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:
Code:
-------------------------------------------------------------
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
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...
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.531 Beiträge
 
Delphi 12 Athens
 
#7

AW: Limitierte Dateigröße mit SingleFileDataStorage?

  Alt 27. Okt 2014, 10:12
Zitat:
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.
Durch die Komprimierung sind diese Dateien natürlich nur ein paar Byte groß, da sowas extrem gut komprimiert werden kann.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
shadowman

Registriert seit: 1. Nov 2005
48 Beiträge
 
#8

AW: Limitierte Dateigröße mit SingleFileDataStorage?

  Alt 27. Okt 2014, 10:34
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...
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:38 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz