2011-08-03 18 views
6

Có bất kỳ điều gì trong API Windows C++ để cung cấp cho tôi danh sách các quy trình có xử lý cho một tệp nhất định không?cách tìm quy trình có xử lý trên tệp từ tên tệp

+0

Nghiên cứu của bạn trong tài liệu được tiết lộ cho đến thời điểm này? –

+0

Trong linux có fuser cho việc này. Rõ ràng các cửa sổ tương đương được gọi là Xử lý (được tìm thấy chỉ bởi searning windows fuser). Đó là một lệnh không phải là lệnh gọi api, nhưng có thể giúp tìm kiếm của bạn – frankc

+0

ý tưởng duy nhất tôi có bây giờ là gọi handle.exe với tên tệp và điều đó sẽ cho tôi biết chi tiết. Tôi không muốn bắt đầu một quá trình cho điều này nếu có một api hiện có mà thực hiện điều này. –

Trả lời

1

Từ blog của Microsoft: How do I find out which process has a file open?

Nhập Restart Manager.

Mục tiêu chính thức của Trình quản lý khởi động lại là giúp bạn có thể tắt và khởi động lại ứng dụng đang sử dụng tệp bạn muốn cập nhật. Để làm được điều đó, nó cần phải theo dõi quá trình nào đang nắm giữ các tham chiếu đến các tệp nào. Và đó là cơ sở dữ liệu được sử dụng ở đây. (Tại sao hạt nhân theo dõi quá trình nào có một tập tin mở? Bởi vì đó là trò chuyện của nguyên tắc không theo dõi thông tin bạn không cần: Bây giờ nó cần thông tin!)

Đây là một chương trình đơn giản lấy tên tệp trên dòng lệnh và hiển thị các quy trình nào có tệp đang mở.

#include <windows.h> 
#include <RestartManager.h> 
#include <stdio.h> 

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 = argv[1]; 
    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; 
} 
Các vấn đề liên quan