win32 – 找出占用文件的进程id和name

日常文件操作的时候,在删除或者移动某个文件的时候,发现它被某些进程占用了。

那么下面的代码就可以帮助我们找出这些进程的id和name。

原理:

将资源注册到Restart Manager会话。重新启动管理器使用在会话中注册的资源列表来确定必须关闭并重新启动哪些应用程序和服务。

代码:

#include <windows.h>
#include <RestartManager.h>
#include <stdio.h>
#pragma comment(lib,"Rstrtmgr.lib")
int __cdecl wmain(int argc, WCHAR** argv)
{
    DWORD dwSession;
    WCHAR szSessionKey[CCH_RM_SESSION_KEY + 1] = { 0 };
    DWORD dwError = RmStartSession(&dwSession, 0, szSessionKey);
    wprintf(L"RmStartSession returned %d\n", dwError);
    if (dwError == ERROR_SUCCESS) {
        PCWSTR pszFile = L"test.txt";
        dwError = RmRegisterResources(dwSession, 1, &pszFile,
            0, NULL, 0, NULL);
        wprintf(L"RmRegisterResources(%ls) returned %d\n",
            pszFile, dwError);
        if (dwError == ERROR_SUCCESS) {
            DWORD dwReason;
            UINT i;
            UINT nProcInfoNeeded;
            UINT nProcInfo = 10;
            RM_PROCESS_INFO rgpi[10];
            dwError = RmGetList(dwSession, &nProcInfoNeeded,
                &nProcInfo, rgpi, &dwReason);
            wprintf(L"RmGetList returned %d\n", dwError);
            if (dwError == ERROR_SUCCESS) {
                wprintf(L"RmGetList returned %d infos (%d needed)\n",
                    nProcInfo, nProcInfoNeeded);
                for (i = 0; i < nProcInfo; i++) {
                    wprintf(L"%d.ApplicationType = %d\n", i,
                        rgpi[i].ApplicationType);
                    wprintf(L"%d.strAppName = %ls\n", i,
                        rgpi[i].strAppName);
                    wprintf(L"%d.Process.dwProcessId = %d\n", i,
                        rgpi[i].Process.dwProcessId);
                    HANDLE hProcess = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION,
                        FALSE, rgpi[i].Process.dwProcessId);
                    if (hProcess) {
                        FILETIME ftCreate, ftExit, ftKernel, ftUser;
                        if (GetProcessTimes(hProcess, &ftCreate, &ftExit,
                            &ftKernel, &ftUser) &&
                            CompareFileTime(&rgpi[i].Process.ProcessStartTime,
                                &ftCreate) == 0) {
                            WCHAR sz[MAX_PATH];
                            DWORD cch = MAX_PATH;
                            if (QueryFullProcessImageNameW(hProcess, 0, sz, &cch) &&
                                cch <= MAX_PATH) {
                                wprintf(L"  = %ls\n", sz);
                            }
                        }
                        CloseHandle(hProcess);
                    }
                }
            }
        }
        RmEndSession(dwSession);
    }
    return 0;
}

相关: How do I find out which process has a file open?

原文链接: https://www.cnblogs.com/strive-sun/p/14202682.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    win32 - 找出占用文件的进程id和name

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/404754

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年4月25日 下午4:42
下一篇 2023年4月25日 下午4:42

相关推荐