นับตั้งแต่ฉันเริ่มใช้ Windows 7 ปัญหานี้ทำให้ฉันรำคาญ ในบางครั้งฉันพบคำถามที่คล้ายกันปรากฏขึ้นในฟอรัมอื่น ๆ แต่ฉันไม่เคยเห็นคำตอบเลย ต่อไปนี้เป็นสถานการณ์สองสถานการณ์ที่ทำซ้ำได้เกือบทุกครั้ง:
วิธีสำรวจ
- ด้วย explorer ไปที่ไดเรกทอรีที่มีไฟล์ exe อย่างน้อยหนึ่งไฟล์
- ไปหนึ่งไดเรกทอรีทันที
- ลบไดเรกทอรีที่เพิ่งนำทางไป
- Yields Folder Access Deniedกล่องโต้ตอบที่ระบุว่าคุณต้องได้รับอนุญาตในการดำเนินการนี้คุณต้องได้รับอนุญาตจากผู้ดูแลระบบเพื่อทำการเปลี่ยนแปลงในโฟลเดอร์นี้โดยที่ปุ่มลองอีกครั้งและยกเลิก
- การลองใหม่อีกครั้งจะไม่ทำงานทันที รอสักครู่แล้วคลิกอีกครั้งก็ใช้งานได้
หมายเหตุ: หากอยู่ในขั้นตอนที่ 2 และรอหนึ่งนาทีหรือมากกว่าก่อนขึ้นไดเรกทอรีหนึ่งปัญหาจะไม่เกิดขึ้นและสามารถลบโฟลเดอร์ได้
วิธี Visual Studio
- สร้างโครงการที่สร้างไฟล์ exe
- เรียกใช้โปรแกรมปฏิบัติการจากนั้นปิด
- สร้างโครงการทันทีอีกครั้ง (โดยเปลี่ยนตัวอักษรตัวเดียวในไฟล์ต้นฉบับเป็นต้น)
- อัตราผลตอบแทนLNK1168 ข้อผิดพลาดร้ายแรง: ไม่สามารถเปิด /path/to/the.exe สำหรับการเขียน
หมายเหตุ: หากในขั้นตอนที่ 2 และรอหนึ่งนาทีหรือมากกว่าก่อนที่จะสร้างอีกครั้งปัญหาจะไม่เกิดขึ้น
รายละเอียดบางอย่าง
- เกิดขึ้นทั้งบน Windows 7 32 และ 64 บิตด้วย VS2008 / 2010/2011
- เกิดขึ้นกับ 3 เครื่องที่แตกต่างกัน
- ฉันไม่มีเครื่องสแกนไวรัสทุกชนิด
- ฉันปิดใช้งานบริการมากมาย แต่ไม่มีสิ่งใดที่ป้องกัน Windows ไม่ให้ทำงานตามปกติ UAC ก็ถูกปิดการใช้งานเช่นกัน
- เกิดขึ้นกับแผ่นดิสก์ทุกประเภท
- ฉันมักจะใช้บัญชีผู้ใช้ที่อยู่ในกลุ่มผู้ดูแล
เห็นได้ชัดว่าสถานการณ์ทั้งสองมีความคล้ายคลึงกันมากและทำซ้ำได้อย่างมาก ดังนั้นฉันคิดว่ากระบวนการบางอย่างจะต้องเปิดไฟล์ด้วยเหตุผลบางอย่างแล้วปล่อยอีกครั้งในภายหลัง อย่างไรก็ตามการใช้ sysinternals
handle -a
ไฟล์ exe ที่เป็นปัญหาจะไม่ปรากฏขึ้น (นั่นเป็นวิธีที่ถูกต้องในการใช้การจัดการใช่ไหม) ดังนั้นในขณะที่ explorer / VS กำลังรายงานว่าพวกเขาไม่สามารถเข้าถึงไฟล์ handle.exe บอกว่ามันไม่ได้ใช้งานทุกที่ สิ่งนี้ทำให้ฉันค่อนข้างไร้เดียงสาดังนั้นฉันจึงสงสัยว่าใครบางคนสามารถหาทางแก้ปัญหาได้: ทำไมจึงเกิดเหตุการณ์นี้ขึ้นและจะแก้ไขได้อย่างไร
อัปเดตเพื่อตอบคำถามที่ถาม:
- ฉันไม่สามารถทำซ้ำปัญหาในเซฟโหมด
- มีการติดตั้งส่วนขยายของเชลล์จำนวนมาก จาก SellExView ต่อไปนี้เป็นรายการที่ไม่ใช่ไมโครซอฟท์ที่ใช้ร่วมกับเครื่องทั้งหมด: NitroPDF, WinRAR, TortoiseGit, TortoiseSvn, NVidia ฉันจะพบเต่าที่น่าสงสัยที่สุดแม้ว่าตัวเลือก 'แคชสถานะ' จะถูกตั้งค่าเป็น 'แคชสถานะสำหรับโฟลเดอร์เดียวเท่านั้นไม่มีการซ้อนทับแบบเรียกซ้ำ' นั่นคือไม่มี TortoiseCache.exe ทำงานอยู่
- ด้วยปัญหาของ explorer ProcessExplorer จะไม่แสดงไฟล์ที่เรียกทำงานได้ มันจะแสดงไดเรกทอรีของแฟ้มที่เรียกใช้งานได้ แต่ยังคงแสดงต่อไปแม้ว่าจะถูกลบไปแล้ว แต่ดูเหมือนว่าจะไม่เกี่ยวข้องกันจริงๆ
- ด้วยปัญหา VS มันเกิดขึ้นกับ VS แม้ว่าจะไม่มีหน้าต่าง explorer เปิดอยู่ในไดเรกทอรีเป้าหมาย และอีกครั้ง ProcessExplorer จะไม่แสดงไฟล์ที่เรียกใช้งานได้และไม่มีไดเรกทอรีที่สามารถใช้งานได้โปรดทราบว่าใน 'โหมด' กับ VS ปัญหานี้จะเกิดขึ้นเฉพาะเมื่อเรียกใช้ไฟล์ปฏิบัติการ หากไม่ได้ใช้งานฉันสามารถสร้างได้โดยไม่มีปัญหาเป็นครั้งคราว
- ใน 'โหมด VS' และหน้าต่าง explorer เปิดในไดเรกทอรีของปฏิบัติการ (ทดสอบด้วย C # exe เท่านั้น) มันจะทำให้ประหลาด: ฉันไม่สามารถสร้างได้อีกเพราะ VS บ่นว่า exe กำลังถูกใช้โดยกระบวนการอื่น อย่างไรก็ตามหากฉันลบ exe ออกจากหน้าต่างเปิด explorer การทำงานนี้จึงประสบความสำเร็จในการสร้าง อีกครั้งไม่มีการอ้างอิงใน ProcessExplorer ใด ๆ มีข้อใดที่ตรงกับสิ่งที่ฉันพบกับ handle.exe (ไม่ใช่ PE และตัวจัดการใช้ API เดียวกันภายในด้วย)
อัปเดต 2 ไม่สามารถเป็น explorer ได้: หลังจากสังหาร explorer.exe ปัญหา VS ยังคงอยู่ที่นั่น
อัปเดต 3 โดยใช้การตรวจสอบกระบวนการตามที่แอชแสดงให้เห็นข้อเท็จจริงที่น่าสนใจ: สำหรับโหมด explorer มีการเรียก IRP_MJ_CREATE 10 ครั้งเมื่อเปิดไดเรกทอรี อย่างไรก็ตามมีเพียง 9 การโทรไปยัง IRP_MJ_CLEANUP การเรียกทั้งหมดนี้มาจากภายใน shell32.dll ดังนั้นจึงไม่ใช่ปัญหาการติดตั้งของบุคคลที่สาม และเป็นที่แน่ชัดว่า IRP_MJ_CLEANUP หายไปซึ่งก่อให้เกิดปัญหา: 1 นาทีหลังจากเปิดไดเรคทอรีกระบวนการของระบบจะออกการเรียก IRP_MJ_CLEANUP และไฟล์ถูกปล่อยและถูกลบทิ้ง
อย่างไรก็ตามฉันยังไม่สามารถเข้าใจได้ว่าทำไมสิ่งนี้จึงเกิดขึ้น มันเป็นข้อผิดพลาดของ explorer ที่เกิดจากการเปลี่ยนแปลงบางอย่างที่ฉันทำหรือไม่?
วิธีการแก้! มองผ่านบริการที่ฉันมีคนพิการ, ผมสังเกตเห็นคำอธิบายสำหรับการประยุกต์ใช้ประสบการณ์กล่าวและฉันพูด, ประมวลผลการร้องขอแคชความเข้ากันได้ของโปรแกรมประยุกต์สำหรับการใช้งานที่พวกเขาจะเปิดตัว เสียงที่คุ้นเคย. และแน่นอนหลังจากเริ่มให้บริการฉันไม่สามารถสร้างปัญหาได้อีกต่อไปและผลลัพธ์ของ ProcMon นั้นแตกต่างกันและสั้นลง ตลก แต่เพราะหลังจากหยุดให้บริการอีกครั้งทุกอย่างยังคงดีและผลลัพธ์ของ procmon ยังคงสั้นกว่า
ฉันลองมันในสองเครื่องโดยมีสิ่งที่บุคคลที่ 3 ทำงานอย่างมีความสุขและทุกอย่างยังคงใช้ได้
ฉันไม่แน่ใจว่านี่เป็นข้อผิดพลาดจริงหรือไม่ (คุณสามารถคาดเดาได้ว่าจะปิดใช้งานบริการใด) แต่ก็ไม่ใช่เรื่องปกติที่ปัญหาจะหายไปเพียงแค่เริ่มบริการแล้วหยุดอีกครั้ง
Bounty ไปหาใครก็ตามที่สามารถให้ข้อมูลเชิงลึกเกี่ยวกับเรื่องนี้ได้อีกที่ @ Asher สำหรับการชี้ให้ฉันไปที่ ProcMon ซึ่งท้ายที่สุดก็พาฉันไปในทิศทางที่ถูกต้อง