Ich schreibe etwas C # -Code und ich muss feststellen, ob ein bestimmter Ordner in meinem Windows-Dateisystem geöffnet wurde, während die Anwendung läuft. Gibt es einen Weg, es zu tun? WinAPI vielleicht?
Es gibt drei API-Dinge, von denen ich denke, dass Sie sie überprüfen sollten:
FindFirstChangeNotification () Ссылка Das gibt Ihnen ein Handle, auf dem Sie warten können, und zu dem Suchen nach Änderungen an einer Datei in einer bestimmten Datei, einem Verzeichnis oder Verzeichnis von Verzeichnissen verwenden. Es wird Ihnen nicht sagen, wenn ein Verzeichnis durchsucht wird, aber es wird Ihnen sagen, wenn eine Datei gespeichert, umbenannt und so weiter und so weiter.
SetWindowsHookEx () Ссылка Sie können das einstellen, um Ihnen einen Rückruf zu geben, wenn eine Anzahl von Ereignissen auftritt - in der Tat bin ich ziemlich positiv, dass Sie diesen Rückruf erhalten können, wenn ein Verzeichnis geöffnet wird, aber es wird wahrscheinlich schwierig sein, weil Sie Nachrichten abfangen werden zum Fenster des Entdeckers. Sie werden beim Debuggen neu gestartet.
Windows Shells Ссылка Wenn das nicht schmerzhaft genug war, können Sie versuchen, ein Shell-Programm zu schreiben.
Wenn Sie versuchen, ein Rootkit zu schreiben, sollten Sie nicht wollen, dass ich die Details für Sie verarbeite. Wenn Sie NICHT versuchen, ein Rootkit zu schreiben, schlage ich vor, dass Sie es nachschlagen - sorgfältig. Es gibt Open-Source-Rootkits, und alle müssen den Dateizugriff auf diese Weise überwachen, um sich vor dem Benutzer / Betriebssystem zu verstecken.
Gehen Sie mit den Windows Shell-Erweiterungen. Sie können Shell-Namespace-Erweiterungen verwenden, um einen "virtuellen" Ordner zu erstellen, der nicht vorhanden ist (oder einen echten "versteckt"), wie der GAC (C: \ Windows \ assembly)
Hier sind einige Beispiele für Shell Extension-Codierung in .Net 4.0 .
Ein Spaltenhandler würde zulassen Sie wissen, wenn ein Ordner "geöffnet" ist, und Sie können sogar zusätzliche Daten für jede der Dateien bereitstellen (neue Details Spalten).
Das nächste, was mir einfällt, ist die Static Directory-Klasse. Es bietet Methoden zum Ermitteln des letzten Zugriffs auf eine Datei oder ein Verzeichnis. Sie könnten einen BackgroundWorker einrichten, der überwacht, ob auf das Verzeichnis während eines bestimmten Intervalls zugegriffen wurde. Verfolgen Sie den Anfang und das Ende des Intervalls mithilfe von DateTime, und wenn die letzte Zugriffszeit zwischen diesen liegt, können Sie das Ereignis ProgressChanged des BackgroundWorker verwenden, um die Anwendung zu benachrichtigen.
%Vor%Sie könnten die LastAccessProperty von FileSystemInfo verwenden. Das Problem ist jedoch, dass es zwischengespeichert werden kann.
FileSystemInfo: Ссылка
LastAccessTime-Eigenschaft: Ссылка
Wie bereits erwähnt, kann dies vorab zwischengespeichert werden.
"Der Wert der LastAccessTimeUtc-Eigenschaft wird vorab zwischengespeichert, wenn die aktuelle Instanz des FileSystemInfo-Objekts von einer der folgenden DirectoryInfo-Methoden zurückgegeben wurde:
GetDirectories
GetFiles
GetFileSystemInfos
Aufzählungsverzeichnisse
Aufzählungsdateien
EnumerateFileSystemInfos
Um den letzten Wert zu erhalten, rufen Sie die Refresh-Methode auf. "
Rufen Sie daher die Refresh-Methode auf, aber sie ist möglicherweise noch nicht auf dem neuesten Stand, da Windows den Wert zwischenspeichert. (Dies entspricht msdn doc "FileSystemInfo.Refresh erstellt einen Snapshot der Datei aus dem aktuellen Dateisystem. Refresh kann das zugrunde liegende Dateisystem nicht korrigieren, selbst wenn das Dateisystem falsche oder veraltete Informationen zurückgibt. Dies kann auf Plattformen wie Windows 98 geschehen . "- link: Ссылка
Ich denke, die einzige Möglichkeit, dies zuverlässig zu erreichen, besteht darin, die aktuell laufenden Prozesse zu überwachen und genau nach neuen Explorer.exe-Instanzen und / oder neuen exploited threads von Explorer.exe Ausschau zu halten (die Einstellung "Jedes Fenster in einem separaten Prozess ausführen") kommt hier in die Quere).
Ich gebe zu, ich habe keine Ahnung, wie ich das programmieren soll, aber genau danach würde ich suchen.
Tags und Links c# winapi filesystems event-handling