How do I find out which process is locking a file using .NET?

前端 未结 6 1025
渐次进展
渐次进展 2020-11-22 00:42

I\'ve seen several of answers about using Handle or Process Monitor, but I would like to be able to find out in my own code (C#) which process is locking a file.

I ha

6条回答
  •  余生分开走
    2020-11-22 01:11

    I had issues with stefan's solution. Below is a modified version which seems to work well.

    using System;
    using System.Collections;
    using System.Diagnostics;
    using System.Management;
    using System.IO;
    
    static class Module1
    {
        static internal ArrayList myProcessArray = new ArrayList();
        private static Process myProcess;
    
        public static void Main()
        {
            string strFile = "c:\\windows\\system32\\msi.dll";
            ArrayList a = getFileProcesses(strFile);
            foreach (Process p in a)
            {
                Debug.Print(p.ProcessName);
            }
        }
    
        private static ArrayList getFileProcesses(string strFile)
        {
            myProcessArray.Clear();
            Process[] processes = Process.GetProcesses();
            int i = 0;
            for (i = 0; i <= processes.GetUpperBound(0) - 1; i++)
            {
                myProcess = processes[i];
                //if (!myProcess.HasExited) //This will cause an "Access is denied" error
                if (myProcess.Threads.Count > 0)
                {
                    try
                    {
                        ProcessModuleCollection modules = myProcess.Modules;
                        int j = 0;
                        for (j = 0; j <= modules.Count - 1; j++)
                        {
                            if ((modules[j].FileName.ToLower().CompareTo(strFile.ToLower()) == 0))
                            {
                                myProcessArray.Add(myProcess);
                                break;
                                // TODO: might not be correct. Was : Exit For
                            }
                        }
                    }
                    catch (Exception exception)
                    {
                        //MsgBox(("Error : " & exception.Message)) 
                    }
                }
            }
    
            return myProcessArray;
        }
    }
    

    UPDATE

    If you just want to know which process(es) are locking a particular DLL, you can execute and parse the output of tasklist /m YourDllName.dll. Works on Windows XP and later. See

    What does this do? tasklist /m "mscor*"

提交回复
热议问题