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

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

dział ogólny

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

Nowy postprzez Norbit » sobota, 22 października 2016, 13:26

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.
Avatar użytkownika
Norbit
Bladawiec
Bladawiec
 
Posty: 33
Dołączył(a): wtorek, 15 lipca 2008, 22:43
Podziękował : 1
Otrzymał podziękowań: 1
    Windows 7Firefox

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

Nowy postprzez polymorphism » sobota, 22 października 2016, 14:14

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.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows 7Firefox

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

Nowy postprzez Norbit » sobota, 22 października 2016, 16:37

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ć
}
Avatar użytkownika
Norbit
Bladawiec
Bladawiec
 
Posty: 33
Dołączył(a): wtorek, 15 lipca 2008, 22:43
Podziękował : 1
Otrzymał podziękowań: 1
    Windows 7Firefox

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

Nowy postprzez Norbit » sobota, 22 października 2016, 17:42

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.
Avatar użytkownika
Norbit
Bladawiec
Bladawiec
 
Posty: 33
Dołączył(a): wtorek, 15 lipca 2008, 22:43
Podziękował : 1
Otrzymał podziękowań: 1
    Windows 7Firefox

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

Nowy postprzez Norbit » sobota, 22 października 2016, 18:31

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;
}
Avatar użytkownika
Norbit
Bladawiec
Bladawiec
 
Posty: 33
Dołączył(a): wtorek, 15 lipca 2008, 22:43
Podziękował : 1
Otrzymał podziękowań: 1
    Windows 7Firefox

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

Nowy postprzez polymorphism » sobota, 22 października 2016, 18:51

KOD cpp:     UKRYJ  
 if( (sr.Name != ".") & (sr.Name != "..") )

Jeśli to ma być operator logiczny (a ma), to tam powinno być &&.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows 7Firefox

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

Nowy postprzez Norbit » niedziela, 23 października 2016, 13:52

Dzięki, mój błąd. Nie wiem czemu tak to napisałem.
Avatar użytkownika
Norbit
Bladawiec
Bladawiec
 
Posty: 33
Dołączył(a): wtorek, 15 lipca 2008, 22:43
Podziękował : 1
Otrzymał podziękowań: 1
    Windows 7Firefox

Poprzednia strona

  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 41 gości

cron