readdirectorychangesw

___ qstntxt ___

Ich entwickle ein Stück C-Code, der ReadDirectoryChangesW () verwendet, um Änderungen unter einem Verzeichnis in Windows zu überwachen. Ich habe die verwandten MSDN-Einträge für ReadDirectoryChangesW () und die FILE_NOTIFY_INFORMATION-Struktur sowie einige andere Dokumentationselemente gelesen. An diesem Punkt habe ich es geschafft, mehrere Verzeichnisse ohne offensichtliche Probleme in der Überwachung selbst zu überwachen. Das Problem besteht darin, dass die Dateinamen, die von dieser Funktion in die Struktur FILE_NOTIFY_INFORMATION eingefügt werden, nicht kanonisch sind.

Laut MSDN können sie entweder lang oder kurz sein. Ich habe mehrere Beiträge gefunden, die vorschlagen, sowohl kurze als auch lange Pfadnamen zwischenzuspeichern, um diesen Fall zu behandeln. Nach meinen eigenen Tests auf einem Windows 7-System ist dies leider nicht ausreichend, um das Problem zu beheben, da es für jeden Dateinamen nicht nur zwei Alternativen gibt. Das Problem besteht darin, dass in einem Pfadnamen JEDE KOMPONENTE entweder lang oder kurz sein kann. Die folgenden Pfadnamen könnten sich alle auf dieselbe Datei beziehen:

c: \ PROGRA ~ 1 \ MYPROG ~ 1 \ MYDATA ~ 1.TXT

c: \ PROGRA ~ 1 \ MYPROG ~ 1 \ MyDataFile.txt

c: \ PROGRA ~ 1 \ MeinProgramm \ MYDATA ~ 1.TXT

c: \ PROGRA ~ 1 \ MeineProgramm \ MyDataFile.txt

c: \ Programme \ MYPROG ~ 1 \ MYDATA ~ 1.TXT

...

und soweit ich das durch meine Tests mit cmd.exe feststellen kann, sind sie alle absolut akzeptabel. Im Wesentlichen steigt die Anzahl der gültigen Pfadnamen für jede Datei exponentiell mit der Anzahl der Komponenten in ihrem Pfadnamen.

Leider scheint ReadDirectoryChangesW () seinen Ausgabepuffer mit den Dateinamen zu füllen, die dem Systemaufruf zur Verfügung gestellt werden, der jede Operation verursacht. Zum Beispiel, wenn Sie cmd.exe Befehle verwenden, um e.t.c. zu erstellen, umzubenennen oder zu löschen. Dateien, die FILE_NOTIFY_INFORMATION enthält die Dateinamen wie in der Befehlszeile angegeben.

In den meisten Fällen konnte ich GetLongPathName () und Freunde verwenden, um einen eindeutigen Pfad für meine Verwendung zu erhalten. Leider ist das beim Löschen von Dateien nicht möglich - bis ich die Benachrichtigung erhalte, ist die Datei bereits verschwunden und die Funktionen Get * PathName () funktionieren nicht.

Im Moment denke ich darüber nach, ein umfangreicheres Caching zu verwenden, um zu bestimmen, welche alternativen Pfadnamen von Anwendungen für jede Datei verwendet werden, mit Ausnahme von Fällen, in denen jemand entscheidet, eine Datei aus heiterem Himmel zu löschen ungesehener gemischter Pfadname. Und ich denke über das kreative Data-Mining von den Änderungsereignissen des übergeordneten Verzeichnisses nach und versuche, das tatsächliche Verzeichnis für diesen Fall zu überprüfen.

Irgendwelche Vorschläge für einen einfacheren Weg, dies zu tun?

PS1: Während sich Change Journals effektiv darum kümmern würden (ich hoffe), glaube ich nicht, dass ich sie nutzen kann, aufgrund ihrer Verbindungen zu NTFS und dem Mangel an Administratorrechten für meine Anwendung. Ich würde lieber nicht dorthin gehen, wenn ich nicht unbedingt dazu gezwungen bin.

PS2: Bitte beachtet, dass ich hauptsächlich unter Unix code, also sei sanft ...

    
___ tag123windows ___ ALLGEMEINER WINDOWS-SUPPORT IST OFF-TOPIC. Support-Fragen können unter https://superuser.com gestellt werden. Windows ist ein von Microsoft entwickeltes Betriebssystem. Verwenden Sie dieses Tag nur, wenn sich Ihre Frage auf die Verwendung von Windows-APIs oder Windows-spezifischem Verhalten in Bezug auf Ihren Code bezieht, nicht nur, weil Sie Ihren Code unter Windows ausführen. ___ tag123winapi ___ Die Windows-API (früher als Win32-API bezeichnet) ist der Kernsatz von Anwendungsprogrammierschnittstellen, die für die Microsoft Windows-Betriebssysteme verfügbar sind. Mit diesem Tag können Sie Fragen zur Entwicklung nativer Windows-Anwendungen mit der Windows-API beantworten. ___ qstnhdr ___ Wie behandelt man Windows ReadDirectoryChangesW () und seine gemischte lange / kurze Dateinamenausgabe? ___ tag123readdirectorychangsw__ Diese WinAPI-Funktion ruft Informationen ab, die die Änderungen innerhalb des angegebenen Verzeichnisses beschreiben ___ tag123Dateinamen ___ Dateinamen sind Metadaten über eine Datei; Eine Zeichenfolge, die zur eindeutigen Identifizierung einer Datei verwendet wird, die im Dateisystem eines Computers gespeichert ist. ___ answer4179768 ___

Sie müssen nicht jede Kombination zwischenspeichern. Es wird getan, wenn Sie jeden Unterpfad zwischenspeichern, um ihn in die lange Form konvertieren zu können. Zum Beispiel speichern Sie dies:

  • %code%
  • %code%
  • %code%
  • %code%

Wenn Sie nun eine Benachrichtigung von %code% erhalten, teilen Sie sie auf jeden %code% auf und suchen Sie jeden Teil nach seiner langen Form.

Vergessen Sie nicht, dass %code% und %code% auch auf dieselbe Datei zeigen. Vergleichen Sie also Groß- und Kleinschreibung oder konvertieren Sie alles in Großbuchstaben.

Und wenn %code% gelöscht wird, verwenden Sie möglicherweise %code% für %code% .

    
___ tag123c ___ C ist eine universelle Computerprogrammiersprache, die für Betriebssysteme, Bibliotheken, Spiele und andere Hochleistungsanwendungen verwendet wird. Dieses Tag sollte bei allgemeinen Fragen zur C-Sprache verwendet werden, wie in der Norm ISO 9899: 2011 definiert. Fügen Sie ggf. ein versionsspezifisches Tag wie c99 oder c90 für Fragen zu älteren Sprachstandards hinzu. C unterscheidet sich von C ++ und es sollte nicht mit dem C ++ - Tag kombiniert werden, wenn ein rationaler Grund fehlt. ___
1
Antwort

Wie behandelt man Windows ReadDirectoryChangesW () und seine gemischte lange / kurze Dateinamenausgabe?

Ich entwickle ein Stück C-Code, der ReadDirectoryChangesW () verwendet, um Änderungen unter einem Verzeichnis in Windows zu überwachen. Ich habe die verwandten MSDN-Einträge für ReadDirectoryChangesW () und die FILE_NOTIFY_INFORMATION-Struktur s...
14.11.2010, 19:38