CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Jak sprawdzić czy w katalogu pojawił się nowy plik.
Strona 2 z 2

Re: Jak sprawdzić czy w katalogu pojawił się nowy plik.

Nowy postNapisane: sobota, 22 października 2016, 13:26
przez Norbit
W takim razie myślę, że wystarczy mi TSearchRec. Program powiadomi kiedy wystąpiła zmiana w katalogu, wyliczę sobie wszystkie znajdujące się tam pliki, a FindDate będący metodą TSearchRec zwróci mi datę utworzenia pliku, porównując je w trakcie wyliczania będę mógł określić, który plik jest ostatni. Mógłbyś pomóc z FindDate? Tylko proszę o kod na typach UnicodeString a nie wstring jeżeli to możliwe.

Re: Jak sprawdzić czy w katalogu pojawił się nowy plik.

Nowy postNapisane: sobota, 22 października 2016, 14:14
przez polymorphism
Nie korzystam z C++ Buildera, a co za tym idzie z VCL-a, od czasów piątki, czyli z jakieś... 14 lat. Nie wiem, co to jest FindDate, google nic mi nie mówi.


Windowsowe FindFirstFile i FindNextFile zwracają wynik w strukturze WIN32_FIND_DATA. W niej masz między innymi datę utworzenia, którą możesz porównywać funkcją CompareFileTime. Wystarczy zmajstrować prostą pętle.

Re: Jak sprawdzić czy w katalogu pojawił się nowy plik.

Nowy postNapisane: sobota, 22 października 2016, 16:37
przez Norbit
chodzi o coś takiego. Mam datę jedną datę pliku typu FILETIME i chcę ją porównać z datą drugiego pliku też typu FILETIME. Coś takiego raczej nie zadziała:

KOD cpp:     UKRYJ  
TSearchRec sr;
FILETIME stLastFile

// porównanie dat plików
if( sr.FindData.ftLastAccessTime > stLastFile )
{
 // tutaj już wiem co wpisać
}

Re: Jak sprawdzić czy w katalogu pojawił się nowy plik.

Nowy postNapisane: sobota, 22 października 2016, 17:42
przez Norbit
OK. Już sobie poradziłem. Działa idealnie i podaje mi tylko ostatni dodany do katalogu plik:

KOD cpp:     UKRYJ  
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.

Re: Jak sprawdzić czy w katalogu pojawił się nowy plik.

Nowy postNapisane: sobota, 22 października 2016, 18:31
przez Norbit
Z tą zamianą aktualnej daty na FILETIME też sobie poradziłem:

KOD cpp:     UKRYJ  
String __fastcall TForm1::FindDir(String Dir)
{
  TSearchRec sr;

  String sLastFile = "";
  FILETIME stLastFile = {0};

  DWORD dwDt = DateTimeToFileDate( Now() );
  DosDateTimeToFileTime(((LongRec*)&dwDT)->Hi, ((LongRec*)&dwDT)->Lo, &stLastFile);
  LocalFileTimeToFileTime(&stLastFile, &stLastFile);

  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;
}

Re: Jak sprawdzić czy w katalogu pojawił się nowy plik.

Nowy postNapisane: sobota, 22 października 2016, 18:51
przez polymorphism
KOD cpp:     UKRYJ  
 if( (sr.Name != ".") & (sr.Name != "..") )

Jeśli to ma być operator logiczny (a ma), to tam powinno być &&.

Re: Jak sprawdzić czy w katalogu pojawił się nowy plik.

Nowy postNapisane: niedziela, 23 października 2016, 13:52
przez Norbit
Dzięki, mój błąd. Nie wiem czemu tak to napisałem.