天天看點

終于解決了一個Win7 下 VS 編譯的問題,困擾了我好幾個月

用 Win7 一年多了,一直在這個環境下程式設計,其他都挺好,就是有個問題非常惡心,在VS下編譯經常出現程序正在使用,無法覆寫的錯誤,這個問題我記得博問中以前也有其他人遇到過,也沒有解決掉。此問題困擾了我一年,期間我查了很多中英文資料都沒有得到理想的答案。今天實在忍無可忍,又去狗了一下,可能關鍵字輸入不一樣吧,這次終于狗出來了,困擾一年的問題終于解決了。寫此文希望能幫助和我一樣正在為此問題抓狂的同仁。

      這個問題其實并不是VS的問題,隻是因為我用VS需要經常編譯并生成exe檔案,是以才會表現的比較突出。它本質上其實是作業系統本身的問題,其表現為如果你運作了一個exe檔案,當關閉這個程序後,你删除它,在資料總管中你會看到它被删除了,但一重新整理它又出現了,要等待大約5分鐘左右,這個檔案才會實際被删除掉,在此期間你無法對這個檔案覆寫或改名。展現在VS開發環境中就是一旦你編譯完運作過一次這個程式,你後面再編譯,就報程序正在使用,無法覆寫,要等5分鐘後才好。這個等待的時間時長時短,故障也不是每次都出現,不同的exe檔案出現的頻率也不一樣。

       我之前在google 和 百度中搜尋過很多次,中文和英文論壇中都有很多人遇到這個問題,基本上回答者給出的解決方案有以下幾種:

       1. 第三方防毒軟體在作怪

       這個是最容易聯想到的,在MSDN 的英文論壇上,我看到一個來自微軟的工程師就是這麼回答的,他堅決否認是作業系統引起的。由于他代表微軟回答問題,這個很有一些誤導性。實際上我停用了我的防毒軟體,還是無法解決這個問題,論壇上遇到相同問題的人也是一樣。

       2. Indexing service 引起

       這種說法也是想當然的,認為Indexing service 在背景工作,可能會通路這個檔案,導緻無法删除。但這個說法有個問題他無法解釋,就是為什麼隻有exe檔案才出現這個問題?不管怎麼樣,我禁用了 Indexing service 這個服務,結果依然無法解決這個問題。

       3. 權限不夠造成

       這個說法也比較荒謬,權限不夠那應該永遠無法删除才對,而且出錯資訊不應該是程序正在使用。我給了所在目錄最高權限,依然無法解決這個問題。

      為了證明這個問題到底是作業系統的問題還是應用程式的問題,我嘗試了下面方法

      1. 用 ProcessExplorer 來看對應的exe 檔案有沒有程序在占用

      結果是沒有程序在占用。

      2. 将 exe 檔案所在的目錄做了稽核,看删除後到底誰又把它重新建立了,因為删除後從表象上看,重新整理一下,程序又出來了,是以我懷疑有什麼程序重新建立了這個exe檔案。

      結果當删除後,稽核的日志中報告删除成功,之後沒有重建的日志,而此時資料總管中仍然能看到這個檔案,而且無法覆寫和改名。

      由此我基本判斷這個問題是作業系統引起的,和其他應用程式占用無關,exe 被删除後,作業系統中出現了不一緻。很長一段時間我一直沒有找到解決方案,是以我對win7 作業系統抱有成見,因為這個問題實在是個很嚴重的問題,這麼多人都遇到過,居然都沒有去fix 這個bug。不過今天我終于找到了解決方案,看來不是bug,而是使用不當造成,至于為什麼會出現這個問題,我還沒有搞清楚。

      問題的原因是 Application Experience 這個服務被關閉造成的,其實還有一個服務叫Program Compatibility Assistant Service 也要運作,隻有這個兩個服務同時運作,才不會出現這個删除不掉exe 的問題。

繼續閱讀