我们应该会经常遇到这样的情况,当删除一个文件或者文件夹时,提示无法删除,文件被占用;但是提示信息中有时并未给出是被哪个进程所占用,如果能找出文件被哪个进程占用,然后杀死相应的进程,文件就能被删除。
写一个程序,如下所示:
#include "stdafx.h"
#include <Windows.h>
#include <string>
int main()
{
char szFilePath[MAX_PATH + 1] = { 0 };
GetModuleFileName(NULL, szFilePath, MAX_PATH);
std::string strFilePath = szFilePath;
size_t posTemp = strFilePath.find_last_of("\\");
std::string strCurrDir = strFilePath.substr(0, posTemp);
std::string strFile = strCurrDir + "\\" + "TestFile\\1.txt";
HANDLE hFile = CreateFile(strFile.c_str(), GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);
while (1);
return 0;
}
上面的例子很简单,在进程的当前目录下的TestFile目录下,有个1.txt文件,进程打开此文件,然后手工删除此1.txt所在文件夹TestFile,报下面这样的错误。
此时打开任务管理器,进入到性能选项卡,如下所示:
然后打开资源监视器,如下所示:
切换到cpu选项卡,在关联的句柄里面输入文件名称或者文件夹名称,如下所示:
这里面输入的是TestFile,输入后,下面会显示正在搜索的字样,因为这里面会遍历所有的进程,枚举进程打开的文件名,所以会花费少许时间,最终结果出来了,如下图所示:
很明显,OpenFile.exe打开了相应的资源。
**注意:**关联的句柄也可以输入1.txt,只要句柄名称中有此字符串即可,
目前笔者在win7和win10上都有测试过。