C ++ | Windows - 有没有办法找出哪个进程拥有锁定文件的所有权?

时间:2016-11-06 06:11:48

标签: c++ windows file process

我想知道的是,可以尝试打开一个文件(当它失败,因为它已经与另一个进程共享时打开)以确定哪个进程正在使用该文件?

我想知道这些信息的原因是因为我正在制作一个能够解决问题的小应用程序。恶意文件。

例如,某些恶意/广告软件等设置了文件安全描述符,因此用户无法删除文件等。我的应用程序只是重置安全描述符,允许用户重新获得控制权。

我还看到一个文件打开了它的子进程,例如(CreateFile)并关闭了共享模式,因此无法触及该文件,然后应用程序将从内存中执行子进程。

2 个答案:

答案 0 :(得分:2)

是的,一般情况下,您可以使用openfiles命令,在启用此信息的收集后,显示openfiles /local on

在Windows NT中,直到并包括(似乎)Windows XP,有一个名为oh的类似资源工具包命令,是打开句柄的缩写。

两者的替代方法是使用SysInternal' Process Explorer

注意:在某些情况下openfiles将无法列出一些句柄。当Windows拒绝卸载USB磁盘时声称某些进程正在使用该磁盘上的文件时,会发生这种情况。没有这样的过程出现过。

答案 1 :(得分:-1)

我已经开发了一个函数来定位这样的进程,杀死它并删除锁定的文件。

int[] arr = new int[] {48,1,2,3,4};

if(arr[0] == '0')
    Console.WriteLine("Is Zero");

以下是完整的源代码:

int cutCount = 1;
int n = Convert.ToInt32(Console.ReadLine());
string[] userinput = Console.ReadLine().Split(' ');
int[] arr = Array.ConvertAll(userinput, Int32.Parse);

// Loop until we finish to empty the array
while (true)
{
    // remove any zero present in the array
    arr = arr.Where(s => s != 0).ToArray();

    // If we don't have any more elements we have finished
    if(arr.Length == 0) 
        break;

    // find the lowest value
    int k = arr.Min();

    // Start a loop to subtract the lowest value to all elements
    for (int i = 0; i < arr.Length; i++)
        arr[i] -= k;

    // Just some print to let us follow the evolution of the array elements
    Console.WriteLine($"After cut {cutCount} the array length is {arr.Length}");
    Console.Write("Array is composed of: ");
    foreach(int x in arr)
        Console.Write(x + " ");
    Console.WriteLine();
}
Console.ReadLine();