Rumah >pembangunan bahagian belakang >C++ >Bagaimana Mengenalpasti Proses Mengunci Fail dalam .NET Menggunakan API Pengurus Mulakan Semula?

Bagaimana Mengenalpasti Proses Mengunci Fail dalam .NET Menggunakan API Pengurus Mulakan Semula?

Linda Hamilton
Linda Hamiltonasal
2025-01-19 22:26:10848semak imbas

How to Identify Processes Locking a File in .NET Using the Restart Manager API?

Menggunakan Rangka Kerja .NET untuk Mengenalpasti Proses Mengunci Fail

Secara tradisinya, menentukan dengan tepat proses tertentu yang memegang kunci fail dalam rangka kerja .NET memberikan cabaran yang ketara. Walau bagaimanapun, dengan kemajuan Windows moden, API Pengurus Mulakan Semula kini menyediakan mekanisme yang boleh dipercayai untuk menjejaki maklumat ini.

Pelaksanaan Penyelesaian:

Coretan kod berikut menawarkan kaedah yang mantap untuk mengenal pasti proses yang telah mewujudkan kunci pada fail yang ditetapkan:

<code class="language-csharp">public static List<Process> IdentifyFileLockers(string filePath)
{
    uint sessionHandle;
    string sessionKey = Guid.NewGuid().ToString();
    List<Process> lockedByProcesses = new List<Process>();

    int result = RmStartSession(out sessionHandle, 0, sessionKey);
    if (result != 0) throw new Exception("Failed to initiate restart session.  Unable to identify file locker.");

    try
    {
        const int ERROR_MORE_DATA = 234;
        uint processesNeeded = 0,
            processesReturned = 0,
            rebootReasons = RmRebootReasonNone;

        string[] resources = new string[] { filePath }; // Targeting a single resource.

        result = RmRegisterResources(sessionHandle, (uint)resources.Length, resources, 0, null, 0, null);

        if (result != 0) throw new Exception("Resource registration failed.");

        //Note: A race condition exists here. The initial RmGetList() call returns
        //      the total process count.  Subsequent RmGetList() calls to retrieve
        //      actual processes might encounter an increased count.
        result = RmGetList(sessionHandle, out processesNeeded, ref processesReturned, null, ref rebootReasons);

        if (result == ERROR_MORE_DATA)
        {
            // Allocate an array to store process information.
            RM_PROCESS_INFO[] processInfoArray = new RM_PROCESS_INFO[processesNeeded];
            processesReturned = processesNeeded;

            // Retrieve the process list.
            result = RmGetList(sessionHandle, out processesNeeded, ref processesReturned, processInfoArray, ref rebootReasons);
            if (result == 0)
            {
                lockedByProcesses = new List<Process>((int)processesReturned);

                // Iterate through results and populate the return list.
                for (int i = 0; i < processesReturned; i++)
                {
                    try
                    {
                        //Attempt to get the process by ID.  May fail if the process is already gone.
                        Process p = Process.GetProcessById(processInfoArray[i].Process.dwProcessId);
                        lockedByProcesses.Add(p);
                    }
                    catch (ArgumentException) { } // Ignore processes that no longer exist.
                }
            }
        }
    }
    finally
    {
        RmEndSession(sessionHandle);
    }

    return lockedByProcesses;
}</code>

Nota Penting: Melaksanakan kod ini memerlukan akses pendaftaran tanpa hak. Jika proses itu tidak mempunyai kebenaran yang diperlukan, melaksanakan mekanisme IPC (mis., paip bernama) untuk mewakilkan panggilan kepada proses istimewa adalah disyorkan.

Atas ialah kandungan terperinci Bagaimana Mengenalpasti Proses Mengunci Fail dalam .NET Menggunakan API Pengurus Mulakan Semula?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn