2009-07-05 2 views
6

Является ли это каким-либо образом, я могу настроить таргетинг на определенный файл и получать все изменения, которые ему сделаны?«прослушивание» изменений файла в C/C++ (в Windows)

Как файл с именем Names.txt. Могу ли я посмотреть, что файл для имен добавлен? а затем записать их на консоль?

Пример кода с не компилируется в Dev-C++ 4.9.9.2

#include <windows.h> 
#include <stdlib.h> 
#include <stdio.h> 
#include <tchar.h> 

void RefreshDirectory(LPTSTR); 
void RefreshTree(LPTSTR); 
void WatchDirectory(LPTSTR); 

int _tmain(int argc, TCHAR *argv[]) 
{ 
    if(argc != 2) 
    { 
     _tprintf(TEXT("Usage: %s <dir>\n"), argv[0]); 
     return 1; 
    } 

    WatchDirectory(argv[1]); 
} 

void WatchDirectory(LPTSTR lpDir) 
{ 
    DWORD dwWaitStatus; 
    HANDLE dwChangeHandles[2]; 
    TCHAR lpDrive[4]; 
    TCHAR lpFile[_MAX_FNAME]; 
    TCHAR lpExt[_MAX_EXT]; 

    _tsplitpath_s(lpDir, lpDrive, 4, NULL, 0, lpFile, _MAX_FNAME, lpExt, _MAX_EXT); 

    lpDrive[2] = (TCHAR)'\\'; 
    lpDrive[3] = (TCHAR)'\0'; 

// Watch the directory for file creation and deletion. 

    dwChangeHandles[0] = FindFirstChangeNotification( 
     lpDir,       // directory to watch 
     FALSE,       // do not watch subtree 
     FILE_NOTIFY_CHANGE_FILE_NAME); // watch file name changes 

    if (dwChangeHandles[0] == INVALID_HANDLE_VALUE) 
    { 
    printf("\n ERROR: FindFirstChangeNotification function failed.\n"); 
    ExitProcess(GetLastError()); 
    } 

// Watch the subtree for directory creation and deletion. 

    dwChangeHandles[1] = FindFirstChangeNotification( 
     lpDrive,      // directory to watch 
     TRUE,       // watch the subtree 
     FILE_NOTIFY_CHANGE_DIR_NAME); // watch dir name changes 

    if (dwChangeHandles[1] == INVALID_HANDLE_VALUE) 
    { 
    printf("\n ERROR: FindFirstChangeNotification function failed.\n"); 
    ExitProcess(GetLastError()); 
    } 


// Make a final validation check on our handles. 

    if ((dwChangeHandles[0] == NULL) || (dwChangeHandles[1] == NULL)) 
    { 
    printf("\n ERROR: Unexpected NULL from FindFirstChangeNotification.\n"); 
    ExitProcess(GetLastError()); 
    } 

// Change notification is set. Now wait on both notification 
// handles and refresh accordingly. 

    while (TRUE) 
    { 
    // Wait for notification. 

     printf("\nWaiting for notification...\n"); 

     dwWaitStatus = WaitForMultipleObjects(2, dwChangeHandles, 
     FALSE, INFINITE); 

     switch (dwWaitStatus) 
     { 
     case WAIT_OBJECT_0: 

     // A file was created, renamed, or deleted in the directory. 
     // Refresh this directory and restart the notification. 

      RefreshDirectory(lpDir); 
      if (FindNextChangeNotification(dwChangeHandles[0]) == FALSE) 
      { 
       printf("\n ERROR: FindNextChangeNotification function failed.\n"); 
       ExitProcess(GetLastError()); 
      } 
      break; 

     case WAIT_OBJECT_0 + 1: 

     // A directory was created, renamed, or deleted. 
     // Refresh the tree and restart the notification. 

      RefreshTree(lpDrive); 
      if (FindNextChangeNotification(dwChangeHandles[1]) == FALSE) 
      { 
       printf("\n ERROR: FindNextChangeNotification function failed.\n"); 
       ExitProcess(GetLastError()); 
      } 
      break; 

     case WAIT_TIMEOUT: 

     // A timeout occurred, this would happen if some value other 
     // than INFINITE is used in the Wait call and no changes occur. 
     // In a single-threaded environment you might not want an 
     // INFINITE wait. 

      printf("\nNo changes in the timeout period.\n"); 
      break; 

     default: 
      printf("\n ERROR: Unhandled dwWaitStatus.\n"); 
      ExitProcess(GetLastError()); 
      break; 
     } 
    } 
} 

void RefreshDirectory(LPTSTR lpDir) 
{ 
    // This is where you might place code to refresh your 
    // directory listing, but not the subtree because it 
    // would not be necessary. 

    _tprintf(TEXT("Directory (%s) changed.\n"), lpDir); 
} 

void RefreshTree(LPTSTR lpDrive) 
{ 
    // This is where you might place code to refresh your 
    // directory listing, including the subtree. 

    _tprintf(TEXT("Directory tree (%s) changed.\n"), lpDrive); 
} 
+0

Как говорит кухня, нам также нужны сообщения об ошибках. –

ответ

7
+0

Я не могу получить пример для компиляции – 2009-07-05 03:49:02

+0

jakethepillowsnake: отредактируйте исходный вопрос с помощью кода, который вы пробовали, и соответствующей информации, которая поможет нам вам помочь, например, сообщения об ошибках. – xian

1

См. MSDN - вам нужно посмотреть каталог и проигнорировать изменения в других файлах, которые вам не нужны.

Смежные вопросы