Zitat von
3_of_8:
Edit: MD5 kann gar nicht gehen, ohne die Datei zu laden.
Na ja, wenn du das Änderungsdatum lesen möchtest, wird auch lesend auf das Dateisystem zugegriffen (gut, nicht direkt die Datei, aber egal). Ich denke es ging hier eigentlich nur darum, dass sein Programm die Datei einliest und dabei irgendwas mit der Datei macht. wenn die jetzt extern verändert wurde, muss die also nicht mehr konsistent sein und das möchte er verhindern. Lesen sollte also kein Problem sein, es darf halt nur nichts mit dem Inhalt gemacht werden (ausser erstmal den Hash berechnen).
Ich würde dir ehrlich gesagt eher zum Hash raten. Du hast ein fertige
Unit in dem geposteten Link, der übergibst du die Datei und bekommst einen Hash fester Länge. Das hat echt ein paar Vorteile (beim wieder einlesen). Klar, Datumsangaben haben auch eine feste Länge, die dann aber auf anderen Systemen, z.B. englischem Windows ganz anders aussehen. Ist immer wieder ein Problem mit recht neuen Programmierern, deren Programme zwar in eigenen Tests super laufen, beim Kunden dann aber nicht mehr (es gibt wirklich häufig englische Windows Systemeinstellungen!).
Wie hier schon gesagt wurde, kannst du am leichtesten das ganze als Textdatei abspeichern. Von der Registry würde ich dir abraten, ist hier einfach nicht nötig. Klar, kann man verwenden, aber dann ist die Portierbarkeit (einfach umkopieren) nicht mehr gegeben.
Nimm einfach ein TIniFile. Da kannst du eine Sektion anlegen und in der dann die Zuordnungen vom Dateinamen und deinem String (z.B. dem Hash).
Das ganze hätte dann ungefähr die Form:
Delphi-Quellcode:
uses iniFiles, md5;
...
procedure saveMd5ToFile(const FileName : String);
var iniFile : TIniFile;
hash : MD5Digest;
begin
if FileExists(FileName) then
begin
iniFile := TIniFile.Create(ExtractFilePath(ParamStr(0)) + INI_FILE_NAME);
try
hash := MD5File(FileName);
iniFile.WriteString(MD5_SECTION, FileName, MD5Print(hash));
finally
iniFile.Free;
end;
end; // if FileExists(FileName)
end; // procedure saveMd5ToFile(const FileName : String);
function hasChanged(const FileName : String) : Boolean;
var iniFile : TIniFile;
currentHash : MD5Digest;
buffer : String;
begin
result := True;
if FileExists(FileName) then
begin
currentHash := MD5File(FileName);
iniFile := TIniFile.Create(ExtractFilePath(ParamStr(0)) + INI_FILE_NAME);
try
buffer := iniFile.ReadString(MD5_SECTION, FileName, '');
if trim(buffer) <> '' then
begin
result := buffer = MD5Print(currentHash);
end; // if trim(buffer) <> ''
finally
iniFile.Free;
end;
end; // if FileExists(FileName)
end; // function hasChanged(const FileName : String);
[NACH roten Kästen]
Es schadet jedenfalls nichts die Informationen abzuspeichern. Wie gesagt, man kann so leicht feststellen, ob jmd. die Datei verändert hat oder nicht. Ob es ein normaler Benutzer macht oder nicht ist ja eine andere Sache.
Ich denke es war hier ja auch nicht als ernster Schutz vor der Manipulation gedacht (er wollte immerhin auch gar nicht erst verschlüsseln). Und wenn man irgendein Hashverfahren nimmt, müsste der Benutzer dann auch wissen welches genau verwendet wurde, raten kann auch dort schnell zu einem falschen Hash führen (gut, kann man natürlich disassemblieren und auslesen, aber wozu die Mühe?!)
[/NACH roten Kästen]