用什么API可以取得各个进程占用的磁盘文件的信息?

梦想家起飞 2006-11-03 09:50:41
如题,OS是XP,想用C#做。
.Net Framework提供了一个FileSystemWatcher,
但是只能知道哪个文件被访问或者改变了,
而不能找出到底是哪个进程干的好事。

MSDN了一把WMI提供的API,也没有发现能达到目的的东西。
看来只能直接使用WIN32 API?目前有两种想法:

1.往文件系统管理者注册事件,像FileSystemWatcher
那样监听文件系统事件,只是需要同时取得进程以及其下的线程信息。
2.遍历所有或指定的进程,收集它们各自占用的文件句柄,
进而得出文件路径和名称。

但是,我不知道应该使用什么API。。。
...全文
226 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
boywang 2006-11-08
  • 打赏
  • 举报
回复
用native api遍历进程的句柄表可以得到包括文件在内的句柄信息。
KeSummer 2006-11-08
  • 打赏
  • 举报
回复
这个不太可能,除非遍历进程的句柄表,还是参考FILEMON代码吧~
Stefine 2006-11-07
  • 打赏
  • 举报
回复
利用上面的hProcess如何收集它们各自占用的文件句柄

LZ可否说说
Stefine 2006-11-07
  • 打赏
  • 举报
回复
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);
}
梦想家起飞 2006-11-07
  • 打赏
  • 举报
回复
yjgx007正解。我还以为真的没人知道呢。
折腾了好几天,后来自己找到答案了。
国外有个组织制作了很好的例子,
http://www.codeguru.com/Cpp/W-P/system/processesmodules/article.php/c2827
yjgx007 2006-11-06
  • 打赏
  • 举报
回复
这个你可以试下:
先用ToolHelp32或调试函数EnumProcess, EnumModule
MSDN有详细的示例
梦想家起飞 2006-11-06
  • 打赏
  • 举报
回复
移贴至此。
梦想家起飞 2006-11-05
  • 打赏
  • 举报
回复
faint,这个问题太难了吗?
liujia_0421 2006-11-04
  • 打赏
  • 举报
回复
学习...
梦想家起飞 2006-11-04
  • 打赏
  • 举报
回复
up again~
梦想家起飞 2006-11-03
  • 打赏
  • 举报
回复
up!

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧