Je nach Plattform gibt es verschiedene Möglichkeiten, dies zu tun. Ich würde aus folgenden Optionen wählen:
Plattformübergreifend
Qt von Trolltech verfügt über ein Objekt namens QFileSystemWatcher , mit dem Sie Dateien und Verzeichnisse überwachen können. Ich bin mir sicher, dass es andere plattformübergreifende Frameworks gibt, die Ihnen diese Art von Funktionen bieten, aber dieses funktioniert meiner Erfahrung nach ziemlich gut.
Windows (Win32)
Es gibt eine Win32-API namens FindFirstChangeNotification, die den Job erledigt. Es gibt einen schönen Artikel, den eine kleine Wrapper-Klasse für die API namens Wie man eine Benachrichtigung erhält, wenn Änderungen in einem angegebenen Verzeichnis auftreten, mit denen Sie beginnen können.
Windows (.NET Framework)
Wenn Sie C ++ / CLI mit .NET Framework verwenden können, ist
System.IO.FileSystemWatcher die Klasse Ihrer Wahl. Microsoft hat einen schönen Artikel
zum Überwachen von Dateisystemänderungen mit dieser Klasse.
OS X.
Die FSEvents- API ist neu für OS X 10.5 und bietet alle Funktionen .
Linux
Verwenden Sie inotify, wie Alex in seiner Antwort erwähnt hat.
Wenn Sie nicht plattformunabhängig sein müssen, finden Sie unter Linux
inotify
unter http://en.wikipedia.org/wiki/Inotify und the viele Links davon zum Beispiel. Informationen zu Windows finden Sie unter http://msdn.microsoft.com/en-us/library/aa365261(VS.85).aspx .quelle
SimpleFileWatcher könnte das sein, wonach Sie suchen. Aber natürlich ist es eine externe Abhängigkeit - vielleicht ist das für Sie keine Option.
quelle
Sicher, genau wie VC ++. Sie erhalten die zuletzt geänderte Zeit, wenn Sie die Datei öffnen, und Sie überprüfen sie regelmäßig, während Sie die Datei geöffnet haben. Wenn last_mod_time> saved_mod_time, ist es passiert.
quelle
Ein funktionierendes Beispiel für WinCE
void FileInfoHelper::WatchFileChanges( TCHAR *ptcFileBaseDir, TCHAR *ptcFileName ){ static int iCount = 0; DWORD dwWaitStatus; HANDLE dwChangeHandles; if( ! ptcFileBaseDir || ! ptcFileName ) return; wstring wszFileNameToWatch = ptcFileName; dwChangeHandles = FindFirstChangeNotification( ptcFileBaseDir, FALSE, FILE_NOTIFY_CHANGE_FILE_NAME | FILE_NOTIFY_CHANGE_DIR_NAME | FILE_NOTIFY_CHANGE_ATTRIBUTES | FILE_NOTIFY_CHANGE_SIZE | FILE_NOTIFY_CHANGE_LAST_WRITE | FILE_NOTIFY_CHANGE_LAST_ACCESS | FILE_NOTIFY_CHANGE_CREATION | FILE_NOTIFY_CHANGE_SECURITY | FILE_NOTIFY_CHANGE_CEGETINFO ); if (dwChangeHandles == INVALID_HANDLE_VALUE) { printf("\n ERROR: FindFirstChangeNotification function failed [%d].\n", GetLastError()); return; } while (TRUE) { // Wait for notification. printf("\n\n[%d] Waiting for notification...\n", iCount); iCount++; dwWaitStatus = WaitForSingleObject(dwChangeHandles, INFINITE); switch (dwWaitStatus) { case WAIT_OBJECT_0: printf( "Change detected\n" ); DWORD iBytesReturned, iBytesAvaible; if( CeGetFileNotificationInfo( dwChangeHandles, 0, NULL, 0, &iBytesReturned, &iBytesAvaible) != 0 ) { std::vector< BYTE > vecBuffer( iBytesAvaible ); if( CeGetFileNotificationInfo( dwChangeHandles, 0, &vecBuffer.front(), vecBuffer.size(), &iBytesReturned, &iBytesAvaible) != 0 ) { BYTE* p_bCurrent = &vecBuffer.front(); PFILE_NOTIFY_INFORMATION info = NULL; do { info = reinterpret_cast<PFILE_NOTIFY_INFORMATION>( p_bCurrent ); p_bCurrent += info->NextEntryOffset; if( wszFileNameToWatch.compare( info->FileName ) == 0 ) { wcout << "\n\t[" << info->FileName << "]: 0x" << ::hex << info->Action; switch(info->Action) { case FILE_ACTION_ADDED: break; case FILE_ACTION_MODIFIED: break; case FILE_ACTION_REMOVED: break; case FILE_ACTION_RENAMED_NEW_NAME: break; case FILE_ACTION_RENAMED_OLD_NAME: break; } } }while (info->NextEntryOffset != 0); } } if ( FindNextChangeNotification( dwChangeHandles ) == FALSE ) { printf("\n ERROR: FindNextChangeNotification function failed [%d].\n", GetLastError()); return; } break; case WAIT_TIMEOUT: printf("\nNo changes in the timeout period.\n"); break; default: printf("\n ERROR: Unhandled dwWaitStatus [%d].\n", GetLastError()); return; break; } } FindCloseChangeNotification( dwChangeHandles ); }
quelle
Fügen Sie eine Antwort für libuv hinzu (obwohl es in C geschrieben ist), es unterstützt sowohl Windows als auch Linux mit systemspezifischen APIs:
Sie können das Dokument hier überprüfen . Beachten Sie, dass das Dokument besagt, dass die Benachrichtigungs-APIs nicht sehr konsistent sind.
quelle
libuv
demselben Dateisystem auf Dateiverschiebungen achten?move
Ereignis an.