Как получить список открытых файловых дескрипторов по процессам в C #? - PullRequest
39 голосов
/ 07 октября 2008

Как получить список дескрипторов открытых файлов по идентификатору процесса в C #?

Я также заинтересован в поиске и получении имен файлов.

Ищите программный эквивалент того, что делает проводник процессов.

Скорее всего, это потребует взаимодействия.

Учитывая добавленную награду за это, реализация будет ужасно сложной.

Ответы [ 7 ]

23 голосов
/ 07 октября 2008

О, это будет трудно сделать из управляемого кода.

В коде проекта есть образец

Большинство вещей можно сделать во взаимодействии, но вам нужен драйвер для получения имени файла, потому что оно живет в адресном пространстве ядра. Process Explorer встраивает драйвер в свои ресурсы. Получение всего этого от C # и поддержка 64-битной, а также 32-й версии будет большой головной болью.

12 голосов
/ 07 октября 2008

Вы также можете запустить приложение командной строки, Обрабатывать , Марк Русинович, и проанализировать вывод.

10 голосов
/ 07 октября 2008

Вы можете P / INVOKE в функцию NtQuerySystemInformation, чтобы запросить все дескрипторы, а затем перейти оттуда. Это обсуждение групп Google содержит подробности.

8 голосов
/ 21 марта 2011

Посмотрите на этот файл: http://vmccontroller.codeplex.com/SourceControl/changeset/view/47386#195318

И использовать:

DetectOpenFiles.GetOpenFilesEnumerator(processID);

Демо-версия:

using System;
using System.Diagnostics;

namespace OpenFiles
{
    class Program
    {
        static void Main(string[] args)
        {
            using (var openFiles = VmcController.Services.DetectOpenFiles.GetOpenFilesEnumerator(Process.GetCurrentProcess().Id))
            {
                while (openFiles.MoveNext())
                {
                    Console.WriteLine(openFiles.Current);
                }
            }
            Console.WriteLine();
            Console.ReadKey();
        }
    }
}

Имеет зависимость от сборки System.EnterpriseServices

2 голосов
/ 29 июня 2010

Handle - отличная программа, а ссылка на codeproject - хорошая.

@ Brian Причиной кода является то, что handle.exe НЕ распространяется. И при этом они не выпускают их источник.

Похоже, что .Net будет нелегко сделать это, поскольку кажется, что для доступа к информации требуется встроенный диск устройства. Это не может быть сделано в .net без неуправляемой DLL. Это довольно глубокий код ядра по сравнению с типичным .net-кодированием. Я удивлен, что WMI не раскрывает это.

1 голос
/ 21 марта 2011

Взгляните на wj32 Process Hacker версии 1 , который может делать то, что вы просили, и многое другое.

1 голос
/ 21 февраля 2011

Возможно использование инструмента командной строки:

OpenedFilesView v1.50 - Просмотр открытых / заблокированных файлов в вашей системе (проблемы с общим доступом)

http://www.nirsoft.net/utils/opened_files_view.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...