OK. Już sobie poradziłem. Działa idealnie i podaje mi tylko ostatni dodany do katalogu plik:
String __fastcall TForm1::FindDir(String Dir)
{
TSearchRec sr;
String sLastFile = "";
FILETIME stLastFile = {0} ;
if(FindFirst(Dir + "*.*", faAnyFile, sr) == 0)
{
do{
if( (sr.Name != ".") & (sr.Name != "..") )
{
if( CompareFileTime( &sr.FindData.ftLastAccessTime, &stLastFile ) >= 0 )
{
sLastFile = sr.Name;
stLastFile = sr.FindData.ftLastAccessTime;
}
}
}
while(FindNext(sr) == 0);
FindClose(sr);
}
return sLastFile;
}
To oczywiście tylko sama funkcja sprawdzająca, który plik został jako ostatni dodany. W połączeniu z kodem sprawdzającym czy w katalogu zaszły jakieś zmiany, czyli w połączeniu z funkcją
FindFirstChangeNotification z flagą
FILE_NOTIFY_CHANGE_FILE_NAME monitorującą katalog w oddzielnym wątku, działa to dokładnie tak jak oczekiwałem i co najważniejsze nie blokuje mi to programu.
Mógłbym poprawić tylko jeden drobny element, ale nie wiem jak wprowadzić aktualną datę i czas do
FILETIME stLastFile zamiast tego 0. Próbowałem wprowadzać aktualną datę do TDateTime, potem konwertowałem to na datę systemową za pomocą DateTimeToSystemTime, a potem z SYSTEMTIME na FILETIME za pomocą funkcji SystemTimeToFileTime i działało, ale godzina się nie zgadzała, np. zamiast 17 była 19, ale data, minuty i sekundy już się zgadzały. Używałem też SystemTimeToTzSpecificLocalTime do uzgodnienia strefy czasowej podając jako pierwszy argument wartość NULL, bo ze specyfikacji wynika, że funkcja użyje aktualnie aktywnej strefy systemowej, czyli czas powinien się zgadzać:
MSDN napisał(a):If lpTimeZone is NULL, the function uses the currently active time zone.