Saya telah melihat beberapa jawaban tentang penggunaan Handle atau Process Monitor , tetapi saya ingin dapat mengetahui dalam kode saya sendiri (C #) proses mana yang mengunci file.
Saya memiliki perasaan tidak enak bahwa saya akan harus berputar-putar di win32 API, tetapi jika ada yang sudah melakukan ini dan dapat menempatkan saya di jalur yang benar, saya akan sangat menghargai bantuannya.
Memperbarui
Tautan ke pertanyaan serupa
c#
file-locking
AJ.
sumber
sumber
Jawaban:
Salah satu hal yang baik tentang
handle.exe
adalah Anda dapat menjalankannya sebagai proses dan parsing output.Kami melakukan ini dalam skrip penerapan kami - berfungsi seperti pesona.
sumber
Dahulu, mustahil untuk mendapatkan daftar proses mengunci file karena Windows tidak melacak informasi itu. Untuk mendukung API Restart Manager , informasi itu sekarang dilacak.
Saya mengumpulkan kode yang mengambil jalur file dan mengembalikan
List<Process>
semua proses yang mengunci file itu.Menggunakan dari Izin Terbatas (mis. IIS)
Panggilan ini mengakses registri. Jika prosesnya tidak memiliki izin untuk melakukannya, Anda akan mendapatkan ERROR_WRITE_FAULT, artinya
An operation was unable to read or write to the registry
. Anda dapat secara selektif memberikan izin ke akun terbatas Anda ke bagian yang diperlukan dari registri. Meskipun lebih aman untuk memiliki proses akses terbatas Anda menetapkan bendera (misalnya dalam database atau sistem file, atau dengan menggunakan mekanisme komunikasi antarproses seperti antrian atau pipa bernama) dan memiliki proses kedua memanggil Restart Manager API.Memberikan izin selain dari minimal kepada pengguna IIS adalah risiko keamanan.
sumber
tasklist /m YourDllName.dll
dan mengurai output. Lihat stackoverflow.com/questions/152506/…Sangat kompleks untuk menjalankan Win32 dari C #.
Anda harus menggunakan alat Handle.exe .
Setelah itu kode C # Anda harus sebagai berikut:
sumber
/accepteula
. Saya telah memperbarui jawaban Gennady dengan perubahan itu.handle.exe
Saya punya masalah dengan solusi Stefan . Di bawah ini adalah versi modifikasi yang tampaknya berfungsi dengan baik.
MEMPERBARUI
Jika Anda hanya ingin tahu proses mana yang mengunci DLL tertentu, Anda dapat menjalankan dan mengurai output dari
tasklist /m YourDllName.dll
. Bekerja pada Windows XP dan yang lebih baru. LihatApa fungsinya? daftar tugas / m "mscor *"
sumber
myProcessArray
seorang anggota kelas (tetapi juga benar-benar kembali dari getFileProcesses ()? Hal yang sama juga berlakumyProcess
.Ini berfungsi untuk DLL yang dikunci oleh proses lain. Rutin ini tidak akan menemukan misalnya file teks dikunci oleh proses kata.
C #:
VB.Net:
sumber
lebih sederhana dengan LINQ:
sumber