So, hab da mal kurz was gebastelt:
Code:
uses
WinInet;
type
TFTPFilesRec = record
FileName: string;
FileSize: Int64;
CreationTime, LastAccessTime, LastWriteTime: FileTime;
Attributes: Cardinal;
end;
TFTPFiles = Array of TFTPFilesRec;
function GetFTPFileList(const AHost, AUsername, APassword, ADirectory: string;
var AFTPFiles: TFTPFiles): Boolean;
var
hOpen, hConnect, hFind: HINTERNET;
FindData: WIN32_FIND_DATA;
iCounter: Integer;
begin
Result := False;
hOpen := InternetOpen(nil, INTERNET_OPEN_TYPE_DIRECT, nil, nil, 0);
if Assigned(hOpen) then try
hConnect := InternetConnect(hOpen, PChar(AHost), INTERNET_DEFAULT_FTP_PORT,
PChar(AUsername), PChar(APassword), INTERNET_SERVICE_FTP,
INTERNET_FLAG_PASSIVE, 0);
if Assigned(hConnect) then try
hFind := FtpFindFirstFile(hConnect, PChar(ADirectory), FindData,
INTERNET_FLAG_RELOAD, 0);
if Assigned(hFind) then try
iCounter := 0;
repeat
if FindData.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY <>
FILE_ATTRIBUTE_DIRECTORY then
begin
SetLength(AFTPFiles, Succ(iCounter));
with AFTPFiles[iCounter], FindData do
begin
FileName := cFileName;
FileSize := nFileSizeHigh * MAXDWORD + nFileSizeLow;
CreationTime := ftCreationTime;
LastAccessTime := ftLastAccessTime;
LastWriteTime := ftLastWriteTime;
Attributes := dwFileAttributes;
end;
Inc(iCounter);
end;
until not InternetFindNextFile(hFind, @FindData);
Result := True;
finally
InternetCloseHandle(hFind);
end;
finally
InternetCloseHandle(hConnect);
end;
finally
InternetCloseHandle(hOpen);
end;
end;
Diese Funktion erstellt dir deine Dateiliste bzw. Array mit allen möglichen Informationen. Sie listet nur Dateien auf und arbeitet nicht rekursiv, sie behandelt also nur das angegebene Verzeichnis und nicht deren Unterordner. Das könnte man noch ändern, aber dann wäre der Code ein wenig komplexer, ich denke so reicht es.
Möglicher Aufruf:
Code:
var
I: Integer;
A: TFTPFiles;
begin
if GetFTPFileList('ftp.microsoft.com', 'anonymous', 'somepass', 'bussys', A) then
for I := Low(A) to High(A) do
ShowMessage(A[I].FileName + ' ' + IntToStr(A[I].FileSize));
end;
(leerer Ordner == Stammverzeichnis)
Du könntest nun beim Programmstart eine globale Dateiliste bzw. Array damit anlegen und dann z.B in einem bestimmten Intervall eine neue anlegen und beide dann vergleichen. Ich denke, dass mit dem Vergleichen bekommst du auch selber hin, ist ja nur eine bzw. zwei Schleife(n).
Ich hoffe das hilft dir nun ein wenig.