Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi TFileStream Speichern nach Vergrößerung (https://www.delphipraxis.net/149991-tfilestream-speichern-nach-vergroesserung.html)

SyntaxXx 4. Apr 2010 15:09


TFileStream Speichern nach Vergrößerung
 
Hallo leute,
bin gerade an einem neuen kleinen Projekt dran.

Ich erkläre nur einmal ganz kurz die Funktion:
Also ich habe jetzt die Größe einer Datei als MD5 Hash.

Jetzt möchte ich eine belibige Datei in mein Programm laden, die ein wenig kleiner ist als meine Original Datei.
Sprich:
Original Datei = 5 MB
Datei2 = 4,5 MB

Wenn ich nun Datei2 in mein Programm lade, wird von der Größe dieser Datei ein MD5 Hash erstellt.
Sollte dieser Hash nun gleich sein mit dem Hash der Original Datei, dann soll die Datei gespeichert werden.

Sollte der MD5 Hash nicht gleich sein, wir gehen davon aus, das die Datei2 kleiner ist, dann soll auf die Datei 1 Bit daz addiert werden und wieder von der neuen Größe der MD5 Hash erstellt werden.
Und das so lange, bis eben die beiden Hashs gleich sind.

Soweit ist das ganze auch kein Problem.
Hier mal ein wenig Code von mir:

Delphi-Quellcode:
var lstream : TFileStream;
Sollte klar sein.
Delphi-Quellcode:
begin
 Opendialog1.Execute();
 try
 lStream := TFileStream.Create(OpenDialog1.Filename, fmOpenReadWrite);
Hier wähle ich eine Datei aus, und lade sie auf lStream.

Delphi-Quellcode:
lstream.Size := lstream.Size + 1
Und hiermit erhöhe ich die Größe der Datei immer um 1 Bit.


Sollte soweit richtig sein, hoffe ich^^.

Nunja jetzt zu meinem Problem.
Wenn nun die beiden Hashs übereinstimmen, soll die Datei Natürlich gespeichert werden.
Nur wie mache ich das jetzt?

Habe schon
Delphi-Quellcode:
lstream := TFileStream.Create('E:\MD5 After.txt', fmCreate);
probiert, aber dann wird immer nur eine leere Datei erstellt, die 0 Byte groß ist.

Die Datei die ich auf lStream lade (in meinem falle eine Textdatei) steht aber "1234567890" drin.
Also sollt doch auch wenigstens das nach dem speichern auch wieder drin stehen.

Könnt ihr mir helfen?

SirThornberry 4. Apr 2010 15:42

Re: TFileStream Speichern nach Vergrößerung
 
Du redest von Filestreams und von Speichern. Wenn du etwas an einem TFileStream änderst ist das sofort geändert und nichts muss extra gespeichert werden. Mit TFileStream bearbeitest du die Datei sozusagen direkt.
Des weiteren schreibst du
Zitat:

...dann soll auf die Datei 1 Bit daz addiert werde...
Du weißt aber schon das du ein einzelnes Bit nicht speichern kannst sondern nur ganze Bytes?! Und was meinst du mit "auf die Datei addiert werden"? Soll der Inhalt der Datei irgendwie um ein Bit verschoben werden? Oder willst du die Dateigröße neu setzen (wobei wie gesagt nur ganze Bytes möglich sind)?

Christian Seehase 4. Apr 2010 15:50

Re: TFileStream Speichern nach Vergrößerung
 
Moin SyntaxXx,

was soll das eigentlich werden, wenn's fertig ist?
Der MD5-Hash-Wert über die Grösse (als String?) sollte erst dann gleich sein, wenn die Grösse gleich ist.

SyntaxXx 4. Apr 2010 15:58

Re: TFileStream Speichern nach Vergrößerung
 
Also der Hauptsinn des Programmes ist es, 2 genau gleich große Dateien zu haben.
Wobei eine der Dateien erst einmal auf die größe geändert werden muss.
Und um eben die exacte größe zu bekommen, verwende ich eben den MD5 Hash.


@ SirThornberry

Also die Datei soll ich sag mal aufgepumpt werden.
Die Datei bleibt gleich, nur eben die Größe ändert sich.
Hmmm blöd das zu erklären.



Was eben wichtig ist, wenn eine Datei 1000 Bit groß ist und die andere 1001 Bit, dann bekomme ich 2 verschiedene Hashs.
Und das ist eben das Problem. Die größe muss aufs Bit genau überein stimmen.


Ich will nur die größe neu setzen.

DeddyH 4. Apr 2010 16:04

Re: TFileStream Speichern nach Vergrößerung
 
Ich steig da überhaupt nicht durch. Wozu den Hash, wenn es nur um die Dateigröße geht? Und eine Datei mit genau 1001 Bit kann es nicht geben, da Byte die kleinste Einheit ist.

SyntaxXx 4. Apr 2010 16:08

Re: TFileStream Speichern nach Vergrößerung
 
Also einer macht hier gerade ein Denkfehler.

Soweit ich mich entsinnen kann siehts wie folgt aus:

1 Byte = 8 Bit
1 Kilobyte = 1024 Byte
1 Megabyte = 1024 Kilobyte


Also ist Bit doch die kleinste Einheit.

scrat1979 4. Apr 2010 16:11

Re: TFileStream Speichern nach Vergrößerung
 
Zitat:

Zitat von SyntaxXx
Also einer macht hier gerade ein Denkfehler.

Soweit ich mich entsinnen kann siehts wie folgt aus:

1 Byte = 8 Bit
1 Kilobyte = 1024 Byte
1 Megabyte = 1024 Kilobyte


Also ist Bit doch die kleinste Einheit.

Er meinte, Byte ist die kleinste Einheit mit welcher TFileStream und somit die Datei angesprochen werden kann :) natürlich ist das Bit die kleinste Einheit aber im Beispiel eben nicht praktikabel

DeddyH 4. Apr 2010 16:12

Re: TFileStream Speichern nach Vergrößerung
 
Wenn Du es schaffst, eine 1 Bit große Datei anzulegen, geb ich Dir gerne einen aus.

scrat1979 4. Apr 2010 16:17

Re: TFileStream Speichern nach Vergrößerung
 
Wobei ich mich wirklich noch immer Frage, was denn der hash in diesem Beispiel verloren hat. Zwei gleich große Dateien mit unterschiedlichem Inhalt werden mit an Sicherheit grenzender Wahrscheinlichkeit einen komplett anderen md5-Hash produzieren.

Falls es wirklich nur darum geht, die Dateigröße der kleineren an die der größeren anzugleichen, würde ich folgendes machen:

1. Differenz von GroesseDatei1 und GroesseDatei2 bestimmen (sei Hier DiffFileSize)
2. An den FileStream der kleineren Datei z.B. Leerzeichen (DiffFileSize Stück) hinzufügen

Grüsse

DeddyH 4. Apr 2010 16:19

Re: TFileStream Speichern nach Vergrößerung
 
Ja eben, deshalb ja meine Verwunderung.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:29 Uhr.
Seite 1 von 2  1 2      

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