Nee nee, ich meinte: Du kannst mit FindFirst recht einfach alle nötigen Information zu einer Datei erhalten.
In "neueren" WindowsVersionen existieren dafür auch direkt Funktionen,
welche alle Informationen einer Datei zusammen liefern, aber dieses funktioniert zumindestens immer.
Man erhält so praktisch alles von IsDirectory, FileExists, GetFileCreation und GetFileLastWrite über nur ein einziges FindFirst.
Läßt sich vom Code her zwar noch weiter kürzen, aber ich hoffe das stimmt erstmal so:
Delphi-Quellcode:
procedure BuildFileList(aSourceDir, aDestDir: string; aSource, aFiles:
TStringList; aMaxFileAge: Integer); cdecl;
var
sFileName, sSourceFileName: string;
hSearch: THandle;
rSourceFindData, rDestFindData: TWIN32FindData;
ftCreationTime, ftLastWriteTime: TFileTime;
begin
// einmal reicht ... muß ja nicht bei jeder Datei einzeln
aSourceDir := IncludeTrailingPathDelimiter(aSourceDir);
aDestDir := IncludeTrailingPathDelimiter(aDestDir);
aFiles.BeginUpdate;
try
for sFileName in aSource do
begin
sSourceFileName := aSourceDir + sFileName;
hSearch := FindFirstFile(PChar(sSourceFileName), rSourceFindData);
Windows.FindClose(hSearch);
if (hSearch = INVALID_HANDLE_VALUE)
or (rSourceFindData.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY <> 0) then
Continue;
hSearch := FindFirstFile(PChar(aDestDir + sFileName), rDestFindData);
Windows.FindClose(hSearch);
if hSearch = INVALID_HANDLE_VALUE then
begin
aFiles.Add(sSourceFileName);
Continue;
end;
if aMaxFileAge = 0 then
begin
if UInt64(rSourceFindData.ftLastWriteTime) > UInt64(rDestFindData.ftLastWriteTime) then
aFiles.Add(sSourceFileName);
end
else
begin
FileTimeToLocalFileTime(rSourceFindData.ftCreationTime, ftCreationTime);
FileTimeToLocalFileTime(rSourceFindData.ftLastWriteTime, ftLastWriteTime);
if (DaysBetween(FileTimeToDateTime(ftCreationTime), Date) <= aMaxFileAge)
or (DaysBetween(FileTimeToDateTime(ftLastWriteTime), Date) <= aMaxFileAge) then
aFiles.Add(sSourceFileName);
end;
end;
aFiles.Sort;
finally
aFiles.EndUpdate;
end;
end;
Delphi-Quellcode:
procedure BuildFileList(aSourceDir, aDestDir: string; aSource, aFiles:
TStringList; aMaxFileAge: Integer); cdecl;
var
sFileName, sSourceFileName: string;
hSearch: THandle;
rSourceFindData, rDestFindData: TWIN32FindData;
ftCreationTime, ftLastWriteTime: TFileTime;
begin
// einmal reicht ... muß ja nicht bei jeder Datei einzeln
aSourceDir := IncludeTrailingPathDelimiter(aSourceDir);
aDestDir := IncludeTrailingPathDelimiter(aDestDir);
aFiles.BeginUpdate;
try
for sFileName in aSource do
begin
sSourceFileName := aSourceDir + sFileName;
hSearch := FindFirstFile(PChar(sSourceFileName), rSourceFindData);
Windows.FindClose(hSearch);
if (hSearch = INVALID_HANDLE_VALUE)
or (rSourceFindData.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY <> 0) then
Continue;
hSearch := FindFirstFile(PChar(aDestDir + sFileName), rDestFindData);
Windows.FindClose(hSearch);
if hSearch = INVALID_HANDLE_VALUE then
begin
aFiles.Add(sSourceFileName);
* end
* else
* if aMaxFileAge = 0 then
begin
if UInt64(rSourceFindData.ftLastWriteTime) > UInt64(rDestFindData.ftLastWriteTime) then
aFiles.Add(sSourceFileName);
end
else
begin
FileTimeToLocalFileTime(rSourceFindData.ftCreationTime, ftCreationTime);
FileTimeToLocalFileTime(rSourceFindData.ftLastWriteTime, ftLastWriteTime);
if (DaysBetween(FileTimeToDateTime(ftCreationTime), Date) <= aMaxFileAge)
or (DaysBetween(FileTimeToDateTime(ftLastWriteTime), Date) <= aMaxFileAge) then
aFiles.Add(sSourceFileName);
end;
end;
aFiles.Sort;
finally
aFiles.EndUpdate;
end;
end;
[edit]
das mit dem FindClose vergeß ich ständig