如题,OS是XP,想用C#做。
.Net Framework提供了一个FileSystemWatcher,
但是只能知道哪个文件被访问或者改变了,
而不能找出到底是哪个进程干的好事。MSDN了一把WMI提供的API,也没有发现能达到目的的东西。
看来只能直接使用WIN32 API?目前有两种想法:1.往文件系统管理者注册事件,像FileSystemWatcher
  那样监听文件系统事件,只是需要同时取得进程以及其下的线程信息。
2.遍历所有或指定的进程,收集它们各自占用的文件句柄,
  进而得出文件路径和名称。但是,我不知道应该使用什么API

解决方案 »

  1.   

    这个你可以试下:
    先用ToolHelp32或调试函数EnumProcess, EnumModule
    MSDN有详细的示例
      

  2.   

    yjgx007正解。我还以为真的没人知道呢。
    折腾了好几天,后来自己找到答案了。
    国外有个组织制作了很好的例子,
    http://www.codeguru.com/Cpp/W-P/system/processesmodules/article.php/c2827
      

  3.   

    CreateToolhelp32Snapshot  与THREADENTRY32 结合遍历所有或指定的进程#include   <windows.h>   
      #include   <tlhelp32.h>   
      #include   <stdio.h>   
        
      BOOL   GetProcessList   ()     
      {     
              HANDLE                   hProcessSnap   =   NULL;     
              BOOL                       bRet             =   FALSE;     
              PROCESSENTRY32   pe32             =   {0};     
          
              //     Take   a   snapshot   of   all   processes   in   the   system.     
        
              hProcessSnap   =   CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,   0);     
        
              if   (hProcessSnap   ==   (HANDLE)-1)     
                      return   (FALSE);     
          
              //     Fill   in   the   size   of   the   structure   before   using   it.     
        
              pe32.dwSize   =   sizeof(PROCESSENTRY32);     
          
              //     Walk   the   snapshot   of   the   processes,   and   for   each   process,     
              //     display   information.     
        
              if   (Process32First(hProcessSnap,   &pe32))     
              {     
                      DWORD                   dwPriorityClass;     
                      BOOL                     bGotModule   =   FALSE;     
                      MODULEENTRY32   me32               =   {0};     
          
                      do     
                      {     
                              bGotModule   =   GetProcessModule(pe32.th32ProcessID,     
                                      pe32.th32ModuleID,   &me32,   sizeof(MODULEENTRY32));     
        
                              if   (bGotModule)     
                              {     
                                      HANDLE   hProcess;     
          
                                      //   Get   the   actual   priority   class.     
                                      hProcess   =   OpenProcess   (PROCESS_ALL_ACCESS,     
                                              FALSE,   pe32.th32ProcessID);     
                                      dwPriorityClass   =   GetPriorityClass   (hProcess);     
                                      CloseHandle   (hProcess);     
        
                                      //   Print   the   process's   information.     
                                      printf(   "\nPriority   Class   Base\t%d\n",     
                                              pe32.pcPriClassBase);     
                                      printf(   "PID\t\t\t%d\n",   pe32.th32ProcessID);   
                                      printf(   "Thread   Count\t\t%d\n",   pe32.cntThreads);   
                                      printf(   "Module   Name\t\t%s\n",   me32.szModule);   
                                      printf(   "Full   Path\t\t%s\n\n",   me32.szExePath);   
                              }     
                      }     
                      while   (Process32Next(hProcessSnap,   &pe32));     
                      bRet   =   TRUE;     
              }     
              else     
                      bRet   =   FALSE;         //   could   not   walk   the   list   of   processes     
          
              //   Do   not   forget   to   clean   up   the   snapshot   object.     
        
              CloseHandle   (hProcessSnap);     
              return   (bRet);     
      }
      

  4.   

    利用上面的hProcess如何收集它们各自占用的文件句柄LZ可否说说
      

  5.   

    这个不太可能,除非遍历进程的句柄表,还是参考FILEMON代码吧~
      

  6.   

    用native api遍历进程的句柄表可以得到包括文件在内的句柄信息。