¿Cómo obtengo la lista de identificadores de archivos abiertos por proceso en C #?

¿Cómo obtengo la lista de identificadores de archivos abiertos por ID de proceso en C #?

Estoy interesado en profundizar y obtener los nombres de los archivos también.

Buscando el equivalente programático de lo que hace el explorador de procesos.

Lo más probable es que esto requiera interoperabilidad.

Considerando agregar una recompensa por esto, la implementación es desagradablemente complicada.

Ouch esto va a ser difícil de hacer desde código administrado.

Hay una muestra en el proyecto de código

La mayoría de las cosas se pueden hacer en interoperabilidad, pero se necesita un controlador para obtener el nombre de archivo porque está en el espacio de direcciones del kernel. Process Explorer incorpora el controlador en sus recursos. Conseguir todo esto conectado desde C # y soportar 64 bits y 32, va a ser un gran dolor de cabeza.

También puede ejecutar la aplicación de línea de comandos, Handle , de Mark Rusinovich, y analizar la salida.

Puede P / INVOCAR en la función NtQuerySystemInformation para consultar todos los identificadores y luego ir desde allí. Esta discusión de grupos de Google tiene detalles.

Eche un vistazo a este archivo: http://vmccontroller.codeplex.com/SourceControl/changeset/view/47386#195318

Y use:

 DetectOpenFiles.GetOpenFilesEnumerator(processID); 

Manifestación:

 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(); } } } 

Tiene dependencia sobre el ensamblado System.EnterpriseServices

Handle es un progtwig excelente, y el enlace al proyecto de código es bueno.

@Brian El motivo del código es que handle.exe NO es redistribuible. Tampoco liberan su fuente.

Parece que .Net no hará esto fácilmente ya que parece que se necesita una unidad de dispositivo incorporada para acceder a la información. Esto no se puede hacer en .NET sin una DLL no administrada. Se trata de un código de kernel relativamente profundo en comparación con la encoding .net típica. Estoy sorprendido de que WMI no exponga esto.

Tal vez usando la herramienta de línea de comandos:

OpenedFilesView v1.50 – Ver archivos abiertos / bloqueados en su sistema (problemas de violación de uso compartido)

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

Eche un vistazo a la versión 1 de Process Hacker de wj32, que puede hacer lo que usted pidió, y más.