Come ottengo l’elenco degli handle di file aperti per processo in C #?

Come ottengo l’elenco degli handle di file aperti per ID processo in C #?

Sono interessato a scavare e ottenere i nomi dei file pure.

Cerchi l’equivalente programmatico di ciò che fa l’explorer di processo.

Molto probabilmente questo richiederà interop.

Considerando di aggiungere una taglia su questo, l’implementazione è sgradevole complicata.

A parte questo sarà difficile da fare con il codice gestito.

C’è un esempio su codeproject

La maggior parte delle cose può essere fatta in interop, ma hai bisogno di un driver per ottenere il nome del file perché vive nello spazio degli indirizzi del kernel. Process Explorer incorpora il driver nelle sue risorse. Ottenere tutto questo collegato da C # e supportare 64 bit e 32, sarà un grosso problema.

Puoi anche eseguire l’app della riga di comando, Gestisci , di Mark Rusinovich, e analizzare l’output.

È ansible P / INVOKE nella funzione NtQuerySystemInformation per richiedere tutti gli handle e quindi passare da lì. Questa discussione sui gruppi di Google contiene dettagli.

Dai un’occhiata a questo file: http://vmccontroller.codeplex.com/SourceControl/changeset/view/47386#195318

E usare:

 DetectOpenFiles.GetOpenFilesEnumerator(processID); 

demo:

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

Ha dipendenza dall’assembly System.EnterpriseServices

Handle è un ottimo programma e il link al codeproject è buono.

@ Brian Il motivo per il codice è che handle.exe non è ridistribuibile. Né rilasciano la loro fonte.

Sembra che. Net non lo farà facilmente, dal momento che sembra che un dispositivo embedded sia richiesto per accedere alle informazioni. Questo non può essere fatto in .net senza una DLL non modificata. È un codice kernel relativamente profondo rispetto alla codifica .net tipica. Sono sorpreso che WMI non esponga questo.

Forse usando lo strumento da riga di comando:

OpenedFilesView v1.50 – Visualizza i file aperti / bloccati nel tuo sistema (condivisione dei problemi di violazione)

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

Dai un’occhiata alla versione 1 di Process Hacker di wj32, che può fare ciò che hai chiesto e altro ancora.