[VB.NET] visualizzare processo che blocca il file

lunedì 27 aprile 2009 - 15.04

TeGlider Profilo | Newbie

ragazzi avete visto quando vogliamo cancellare un file e appare il seguente errore:
"Impossibile eliminare[i]nomefile[/i]: Accesso negato.
Controllare che il disco non sia pieno o protetto da scrittura e che il file non sia attualmente in uso"

Mi spiegate se c'è un modo tramite [b]visual basic.net[/b] di vedere il processo che utilizza il file?? grazie 1000 :)

Jeremy Profilo | Guru

Ciao Carmine.
>Mi spiegate se c'è un modo tramite [b]visual basic.net[/b] di
>vedere il processo che utilizza il file?? grazie 1000 :)
Prova a vedere se la classe Process fa al caso tuo.
http://msdn.microsoft.com/it-it/library/system.diagnostics.process.aspx

Facci sapere...
Ciao

TeGlider Profilo | Newbie

si però non ho proprio idea di come far visualizzare un messaggio con scritto il processo che utilizza il file...

Jeremy Profilo | Guru

Ciao Carmine.
Nello specifico per la tua esigenza non saprei bene che codice dovresti scrivere(dovrei fare delle prove ma forse è meglio che le fai tu).
Quello che ti posso dire è che con questo codice:
For Each Processo As Process In Process.GetProcesses MessageBox.Show(Processo.ProcessName) Next
visualizzi tutti i processi attivi nel task manager.
Per il resto prova a giocare un pò con le proprietà ed i metodi che ti fornisce la classe Process e poi .... facci sapere.
Rimango comunque a disposizione per ulteriori info.

Ciao

aiedail92 Profilo | Expert

Ciao

In realtà non è possibile fare quello che intendi se non con metodi "non tanto puliti"... Infatti gli handle dei file sono dei tipi opachi di cui un programmatore in user-mode non può (o almeno non dovrebbe potere) sapere praticamente niente.

Ci sono comunque almeno due soluzioni, che richiedono una più dell'altra un'ottima conoscenza del funzionamento di Windows e del C\C++ (o un altro linguaggio compilato)

Una prima soluzione, che però dobbiamo sicuramente scartare e te la cito solo per completezza, è creare un driver in kernel-mode. Comunque data la delicatezza e la complessità dello sviluppo, che non può naturalmente avvenire in ambito .net, e la scarsa portabilità, scartiamo a priori questa strada.

Ci resta quindi solo quella più "oscura", cioè l'utilizzo di alcune funzioni di Windows non ufficialmente documentate. La faccenda è abbastanza complicata, devi avere una buona fonte per le informazioni sulle funzioni (ad esempio il libro "Windows NT-2000 Native API Reference" di Gary Nebbett, la "bibbia" delle API non documentate) e una discreta conoscenza del C\C++... Oppure qualcuno che abbia deciso di aiutarti

Ti ho scritto una funzione in C++ che sfrutta le API (ovviamente non documentate) ZwQuerySystemInformation per ottenere tutti gli handle aperti e ZwQueryInformationFile per ottenere il nome del file in base all'handle. Quindi controllo se il nome del file corrisponde al file che volevi "monitorare"; in caso affermativo abbiamo trovato l'handle del file e l'id del processo che lo tiene aperto.

In allegato trovi sia il codice sorgente se vuoi compilartelo, sia due dll già compilate (nel caso non ti andasse una, prova l'altra), per usare la dll da VB.Net devi fare così:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Una volta che hai ottenuto l'id del processo puoi ottenere tutte le informazioni che ti servono su quel processo usando la classe Process e il suo metodo GetProcessById.

Spero che sia stato di aiuto e che possa esserlo in futuro anche per altri, per qualsiasi altro dubbio chiedi pure

Luca

aiedail92 Profilo | Expert

Ciao

Ho aggiornato il codice della dll risolvendo un piccolo bug, sia in questo messaggio che nel precedente trovi in allegato i nuovi sorgenti e le dll già compilate e pronte per l'uso

Luca
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5