Sejak saya mulai menggunakan Windows 7, masalah ini mengganggu saya. Dari waktu ke waktu saya melihat pertanyaan serupa bermunculan di forum misc, tetapi saya tidak pernah melihat jawaban. Berikut adalah dua skenario yang hampir selalu mereproduksinya:
Cara penjelajah
- Dengan explorer, navigasikan ke direktori yang berisi setidaknya satu file exe
- Buka satu direktori dengan segera
- Hapus direktori yang baru saja dinavigasi
- Dialog Akses Folder Yield Ditolak yang menyatakan Anda perlu izin untuk melakukan tindakan ini. Anda memerlukan izin dari Administrator untuk membuat perubahan pada folder ini , dengan tombol coba Lagi dan Batal
- Memukul Coba Lagi tidak pernah berfungsi dengan segera. Menunggu sekitar satu menit dan kemudian mengkliknya lagi tidak berfungsi
Catatan: Jika dalam langkah 2 dan menunggu satu menit atau lebih sebelum naik satu direktori, masalahnya tidak terjadi dan folder dapat dihapus
Cara Visual Studio
- Bangun proyek yang menghasilkan file exe
- jalankan executable lalu tutup
- Segera buat proyek lagi (dengan mengubah satu karakter dalam file sumber misalnya)
- Menghasilkan kesalahan fatal LNK1168: tidak dapat membuka /path/to/the.exe untuk menulis
Catatan: Jika dalam langkah 2 dan menunggu satu menit atau lebih sebelum membangun lagi, masalahnya tidak terjadi.
Beberapa spesifikasi
- Terjadi pada Windows 7 32 dan 64 bit, dengan VS2008 / 2010/2011
- Terjadi pada 3 mesin yang berbeda
- Saya tidak memiliki pemindai virus dalam bentuk apa pun
- Saya memang memiliki banyak layanan yang dinonaktifkan, tetapi tidak ada yang mencegah Windows berjalan normal, UAC juga dinonaktifkan
- Terjadi pada semua jenis disk
- Saya selalu menggunakan akun pengguna yang ada di grup Administrator
Jelas kedua skenario sangat mirip dan sangat bisa direproduksi. Jadi saya pikir beberapa proses harus memiliki file terbuka karena suatu alasan, dan lepaskan lagi nanti. Namun, menggunakan sysinternals
handle -a
file exe yang dipermasalahkan tidak pernah muncul. (itu adalah cara yang benar untuk menggunakan pegangan, kan?) Jadi sementara explorer / VS melaporkan mereka tidak dapat mengakses file, handle.exe mengatakan itu tidak digunakan di mana pun. Ini membuat saya agak tidak mengerti, jadi saya bertanya-tanya apakah seseorang dapat menemukan solusi: mengapa ini terjadi, dan bagaimana mengatasinya?
Pembaruan dalam menanggapi pertanyaan yang diajukan:
- Saya tidak dapat mereproduksi masalah dalam Safe Mode
- Sekelompok ekstensi shell diinstal. Dari SellExView, berikut ini adalah non-microsoft yang umum untuk semua mesin: NitroPDF, WinRAR, TortoiseGit, TortoiseSvn, NVidia. Saya akan menemukan Tortoise yang paling mencurigakan, meskipun untuk kedua opsi 'Status Cache' diatur ke 'Cache status hanya untuk satu folder, tidak ada overlay rekursif' yaitu tidak ada TortoiseCache.exe berjalan.
- Dengan masalah explorer, ProcessExplorer tidak menunjukkan executable. Itu memang menunjukkan direktori yang dapat dieksekusi, tetapi terus menunjukkan bahkan setelah itu dihapus sehingga tampaknya tidak benar-benar terkait
- Dengan masalah VS, itu terjadi dengan VS bahkan ketika tidak ada jendela explorer terbuka di direktori target. Dan lagi, ProcessExplorer tidak menunjukkan executable, atau direktori executable masuk. Perhatikan bahwa dalam 'mode' ini dengan VS, masalah hanya terjadi ketika menjalankan executable. Jika tidak menjalankannya, saya dapat membangunnya tanpa masalah dari waktu ke waktu.
- Dalam 'VS mode' dan jendela explorer terbuka pada direktori yang dapat dieksekusi (hanya diuji dengan C # exe), akan lebih aneh: Saya tidak dapat membangun lagi karena VS mengeluh bahwa exe sedang digunakan oleh proses lain. Namun, jika saya menghapus exe dari jendela explorer terbuka, ini berfungsi, dan akibatnya membangun berhasil. Sekali lagi, tidak ada referensi di ProcessExplorer sama sekali. Yang sepertinya cocok dengan temuan saya dengan handle.exe (bukankah PE dan handle menggunakan API yang sama secara internal?)
Pembaruan 2 Tidak bisa hanya explorer: setelah membunuh explorer.exe, masalah VS masih ada.
Pembaruan 3 Menggunakan Monitor Proses sebagaimana disarankan Asher mengungkapkan fakta menarik: untuk mode penjelajah, ada 10 panggilan ke IRP_MJ_CREATE saat membuka direktori. Namun hanya 9 panggilan ke IRP_MJ_CLEANUP. Semua panggilan ini berasal dari dalam shell32.dll, jadi sudah pasti bukan masalah pemasangan pihak ke-3. Dan itu jelas merupakan IRP_MJ_CLEANUP yang hilang yang menyebabkan masalah: tepat 1 menit setelah membuka direktori, proses Sistem itu sendiri mengeluarkan panggilan IRP_MJ_CLEANUP dan file dilepaskan, dan dihapus.
Namun, saya masih tidak tahu mengapa ini terjadi. Apakah itu bug penjelajah yang dipicu oleh beberapa perubahan yang saya buat?
Larutan! Melihat melalui layanan yang telah saya nonaktifkan, saya perhatikan deskripsi untuk Pengalaman Aplikasi mengatakan, dan saya kutip, Memproses permintaan cache kompatibilitas aplikasi untuk aplikasi saat diluncurkan . Kedengarannya familiar. Dan memang, setelah memulai layanan saya tidak dapat mereproduksi masalah lagi dan hasil ProcMon berbeda dan lebih pendek. Lucu juga, karena setelah menghentikan layanan lagi, semuanya masih baik-baik saja dan output procmon masih lebih pendek.
Saya mencoba ini pada dua mesin, dengan semua hal pihak ke-3 berjalan dengan gembira dan semuanya masih baik-baik saja.
Saya tidak yakin apakah ini bug nyata (bisa dikatakan 'apa yang Anda harapkan dengan menonaktifkan layanan'), tetapi tidak sepenuhnya normal bahwa masalahnya hilang hanya dengan memulai layanan dan kemudian menghentikannya lagi.
Bounty pergi ke siapa saja yang dapat memberikan wawasan yang lebih dalam tentang hal ini, atau kepada @ Asher karena mengarahkan saya ke ProcMon yang pada akhirnya membawa saya ke arah yang benar.