2010-03-19 15 views
10

C'è un modo in .Net per scoprire esattamente quale processo ha bloccato un file?File bloccato da quale processo?

EDIT: Sto facendo questo perché voglio che il mio all'utente di sapere che essi non possono modificare/aprire il file, perché al momento, un altro programma che stanno usando (come Excel) ha Aperto. Speriamo che questo aiuti.

+1

L'informazione sarebbe inutile, perché quando fai qualcosa con esso, non potrebbe essere più preciso. –

+7

Davvero Josh? Ne sei sicuro ... – SpaceghostAli

+0

@SpaceghostAli I file sono sempre bloccati indefinitamente, no? –

risposta

6

La risposta breve a questo è no.

Tuttavia, la risposta lunga è che ci sono varie chiamate API e metodi WMI che è possibile utilizzare per trovare queste informazioni, ma non aspettarsi che sia rapido e semplice.

Se si desidera utilizzare le chiamate API, dare un'occhiata alla funzione NtQuerySystemInformation con il parametro SYSTEM_PROCESS_INFORMATION. Questo è uno di quei bei metodi "senza documenti", che viene fornito con la meravigliosa disclaimer:

NtQuerySystemInformation può essere alterato o non disponibili nelle future versioni di Windows. Le applicazioni devono utilizzare le funzioni alternative elencate in questo argomento.

Quindi vorrei suggerire di evitare quello a favore dell'utilizzo di WMI.

È possibile utilizzare la classe WMI Win32_Process per enumerare tutti i processi attualmente in esecuzione sulla macchina e quindi enumerare tutte le maniglie che ogni processo trattiene finché non si trova il file che si sta cercando. Sfortunatamente non c'è un modo semplice per andare "hey, che processo sta bloccando questo file", funziona solo viceversa devi cercare lungo l'elenco dei processi fino a trovare quello che blocca il file che ti interessa.

Suggerirei un piccolo articolo su CodeProject denominato How To: (Almost) Everything In WMI via C# Part 2: Processes. (Parte 1 è anche una buona lettura se ti piace quel genere di cose)

0

Sembra che qualcuno ha capito questo fuori (e si può imparare un po 'francese, così :))

http://www.axcis.com.au/bb/viewtopic.php?p=505

+0

Sono file attivi per processo. Sta cercando viceversa. –

+0

Vero - se non è critico per le prestazioni, è possibile enum l'output di tutti i processi in cerca del file. – holtavolt

+0

Quando ho implementato qualcosa di simile per un server Novell, ho dovuto farlo all'indietro in quel modo: cercare tutto cercando il file. –

1

Beh ... non è esattamente un modo .NET di farlo ... ma supponendo che tu voglia solo scoprire usando un'utilità facile, controlla Handle from SysInternals.

+2

Penso che Irwin stia chiedendo come farlo programmaticamente, non penso che questo lo aiuti davvero. –

+0

@Simon Beh, tecnicamente, è possibile intercettare l'eccezione e quindi richiamare a livello di codice questo strumento da riga di comando per ottenere il/i processo/i che utilizza attualmente il file. Lontano dall'ideale, sì, ma possibile! –

Problemi correlati