2017-07-24 6 views
0

Ich habe eine Anwendung, die Verzeichnisse für Änderungen überwacht. Allerdings, wenn ich ein Verzeichnis umbenennen, kann in Verzeichnis B Verzeichnis A sagt, als ich die folgende Ausgabe Ergebnisse sehen:C++ ReadDirectoryChangesW und Boost gibt dir die Änderung als Datei (OLD NAME)

File renamed (OLD): C:\A 
Directory renamed (NEW): C:\B 

, während ich den Ausgang erwarten:

Directory renamed (OLD): C:\A 
Directory renamed (NEW): C:\B 

Diese Gelegenheit auch auftritt ein Verzeichnis auf Löschen, was die Ausgabe:

File removed: C:\A\test.txt 
File modified: C:\A 
File removed: C:\A 

während ich erwarte, dass die Ausgabe:

File removed: C:\A\test.txt 
Directory modified: C:\A 
Directory removed: C:\A 

Der Code, den ich auf diese Ausgabe erhalten verwenden (mit Boost-Dateisystem) ist:

while(true) { 
    FILE_NOTIFY_INFORMATION* info = reinterpret_cast<FILE_NOTIFY_INFORMATION*>(p); 
    int ret = ::WideCharToMultiByte(CP_ACP, 0, info->FileName, info->FileNameLength/sizeof(WCHAR), FilePathChar, sizeof(FilePathChar), NULL, NULL); 
    stringstream FilePathStream; 
    FilePathStream << argv[1]; 
    FilePathStream << "\\"; 
    FilePathStream << FilePathChar; 
    string FilePath = FilePathStream.str(); 
    cout << FilePath << endl; 
    boost::filesystem::path path(FilePath); 
    string Type = "File"; 
    if (boost::filesystem::is_directory(path)) { 
     Type = "Directory"; 
     } 
    ofstream myfile; 
    myfile.open("changes.txt", std::ios_base::app); 
    switch (info->Action) { 
     case FILE_ACTION_ADDED: 
      myfile << Type << " added: " << FilePath << "\n"; 
      break; 
     case FILE_ACTION_MODIFIED: 
      myfile << Type << " modified: " << FilePath << "\n"; 
      break; 
     case FILE_ACTION_REMOVED: 
      myfile << Type << " removed: " << FilePath << "\n"; 
      break; 
     case FILE_ACTION_RENAMED_NEW_NAME: 
      myfile << Type << " renamed (NEW): " << FilePath << "\n"; 
      break; 
     case FILE_ACTION_RENAMED_OLD_NAME: 
      myfile << Type << " renamed (OLD): " << FilePath << "\n"; 
      break; 
     default: 
      myfile << Type << " UNDISCOVERED ACTION: " << FilePath << "\n"; 
      break; 
     } 
    myfile.close(); 
    ::memset(FilePathChar, '\0', sizeof(FilePathChar)); 
    if (!info->NextEntryOffset) break; 
    p += info->NextEntryOffset; 
    } 

Was mache ich falsch hier?

+0

@HansPassant, wird es tatsächlich nicht. Wie die Dokumentation sagt, wird es den relativen Pfad aus dem überwachten Verzeichnis zurückgeben. –

Antwort

2

Das Problem ist, dass Sie in beiden Fällen die Benachrichtigung erst erhalten, wenn das Verzeichnis nicht mehr heißt (entweder weil es gelöscht oder verschoben wurde). Also, wenn Sie gehen:

if (boost::filesystem::is_directory(path)) { 
    Type = "Directory"; 
} 

is_directory kehrt false (so lassen Sie Type als "File")

Ich schlage vor, statt:

const std::string Type = boost::filesystem::is_directory(path) ? "Directory" : 
         boost::filesystem::is_regular_file(path) ? "File" : 
                    "unknown"; 
+0

Danke für Ihre Antwort. Die Benachrichtigung wird also ausgelöst, wenn das Verzeichnis bereits entfernt wurde? Also, wenn ich ein FileExists hinzufüge, würde es diese (unerwarteten) Ergebnisse beseitigen? –

+0

Richtig, aber das wird unbekannt anstelle von Verzeichnis zurückgeben, da der Pfad nicht existiert, wenn der Typ bestimmt wird? Ich muss einige Aktionen basierend auf Datei oder Verzeichnis auslösen. Also, wenn der Pfad nicht mit einem Dateinamen und einer Erweiterung endet, wie sicher ist es dann anzunehmen, dass es ein Verzeichnis ist? Es ist irrelevant für die Operation, die aufgerufen wird, ob die Datei/das Verzeichnis noch existiert, da sie eine Datenbank synchronisiert –

+0

Sie können nicht aus dem Pfadnamen erkennen, ob ein Pfad eine Datei oder ein Verzeichnis war. Versuchen Sie, C: \ A \ b als einfache Datei zu erstellen und zu löschen. Vielleicht können Sie in der Datenbank nach dem alten Typ suchen? Ich denke, das ist ein X-Y-Problem - stellen Sie eine andere Frage mit Ihrem * tatsächlichen * Problem. –

Verwandte Themen