簡體   English   中英

在Windows中處理系統文件夾事件

[英]Handle system folders event in windows

我正在編寫一些C#代碼,並且需要檢測在應用程序運行時Windows文件系統上的特定文件夾是否已打開。 有什么辦法嗎? WinAPI的也許?

我認為您應該檢查以下三點API:

FindFirstChangeNotification() http://msdn.microsoft.com/zh-cn/library/aa364417%28VS.85%29.aspx這樣可以為您提供一個句柄,您可以等待並用於查找對特定文件中文件的更改,目錄或目錄樹。 它不會告訴您何時瀏覽目錄,但會告訴您何時保存,重命名文件等等。

SetWindowsHookEx() http://msdn.microsoft.com/zh-cn/library/ms644990%28v=VS.85%29.aspx您可以將其設置為在發生任何數量的事件時為您提供回調-實際上我我很肯定打開目錄后可以得到此回調,但是這可能會非常困難,因為您將截取到瀏覽器窗口的消息。 因此,您將在調試過程中重新啟動。

Windows Shell http://msdn.microsoft.com/zh-cn/library/bb776778%28v=VS.85%29.aspx如果這還不夠痛苦,則可以嘗試編寫Shell程序。

如果您想編寫一個rootkit,我想您不想讓我破壞您的細節。 如果您不想編寫rootkit,建議您仔細檢查一下。 有開源的rootkit,它們基本上都必須監視文件訪問,以這種方式對用戶/ OS隱藏。

使用Windows Shell擴展。 您可以使用Shell命名空間擴展名創建一個不存在的“虛擬”文件夾(或隱藏一個真實的文件夾),例如GAC(C:\\ Windows \\ assembly)

這是.Net 4.0中Shell擴展編碼的幾個示例

列處理程序會在文件夾“打開”時通知您,甚至可以為每個文件(新的詳細信息列)提供額外的數據。

檢出FileSystemWatcher類。

我能想到的對您可能有用的最接近的方法是使用靜態Directory類。 它提供了確定上次訪問文件或目錄的方法。 您可以設置BackgroundWorker來監視在指定間隔內是否訪問了目錄。 使用DateTime跟蹤時間間隔的開始和結束,如果上次訪問時間介於兩者之間,則可以使用BackgroundWorker的ProgressChanged事件通知應用程序。

 BackgroundWorker folderWorker = new BackgroundWorker();
 folderWorker.WorkerReportsProgress = true;
 folderWorker.WorkerSupportsCancellation = true;
 folderWorker.DoWork += FolderWorker_DoWork;
 folderWorker.ProgressChanged += FolderWorker_ProgressChanged;

 folderWorker.RunWorkerAsync();

 void FolderWorker_DoWork(object sender, DoWorkEventArgs e)
 {
      BackgroundWorker worker = (BackgroundWorker)sender;

      while(!worker.CancellationPending)
      {
           DateTime lastAccess = Directory.GetLastAccessTime(DIRECTORY_PATH);

           //Check to see if lastAccess falls between the last time the loop started
           //and came to end.
           if(/*your check*/)
           {
                object state;  //Modify this if you need to send back data.
                worker.ReportProgress(0, state);
           }
      }
 }

 void FolderWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
 {
      //Take action here from the worker.ReportProgress being invoked.
 }

您可以使用FileSystemInfo的LastAccessProperty。 問題是它可以被緩存。

FileSystemInfo: http : //msdn.microsoft.com/en-us/library/975xhcs9.aspx

LastAccessTime屬性: http : //msdn.microsoft.com/zh-cn/library/system.io.filesysteminfo.lastaccesstimeutc.aspx

如前所述,這可以預先緩存。

“如果FileSystemInfo對象的當前實例是從以下任何DirectoryInfo方法返回的,則LastAccessTimeUtc屬性的值將被預先緩存:

獲取目錄

獲取文件

GetFileSystemInfos

枚舉目錄

枚舉文件

枚舉文件系統信息

要獲取最新值,請調用Refresh方法。”

因此,請調用Refresh方法,但是由於Windows緩存該值,該方法可能仍然不是最新的。 (這是根據msdn doc的“ FileSystemInfo.Refresh從當前文件系統獲取文件的快照。即使文件系統返回了不正確或過時的信息,刷新也無法糾正基礎文件系統。這可能在Windows 98等平台上發生。”-鏈接: http : //msdn.microsoft.com/zh-cn/library/system.io.filesysteminfo.refresh.aspx

我認為,可靠地實現此目標的唯一方法是監視當前正在運行的進程,並密切監視新的Explorer.exe實例和/或新的Explorer.exe產生的線程(“在單獨的進程上運行每個窗口”設置進入方式)。

我承認我對如何編寫此代碼一無所知,但這就是我想要的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM