這個Bug可以簡單描述為:在使用OpenFileDialog嘗試打開一個不存在的文件的時候,OpenFileDialog本身會創建這個不存在的文件並刪除它,然後告訴用戶這個文件不存在。
下面我們來寫個程序來重現這個Bug。基本原理是使用FileSystemWatcher來監視文件夾。
創建使用了如圖1所示的程序。
圖1. 示例程序
首先選擇一個文件夾,並監視裡面的文件改變。
圖2. 監視文件夾
然後在被監視的文件中嘗試打開一個不存在的文件。這個打開文件對話框已經設置CheckFileExists和CheckPathExists為true。
方法很簡單,只要在File Name中隨便輸入一個不存在的文件名,然後點打開就可以了。如圖3所示。
圖3. 打開不存在的文件
然後打開文件對話框“貌似”很乖地彈出了一個消息框,說文件不存在。如圖4。
圖4. 文件不存在消息框
然後我們點取消。但是,我們會發現後面的Output Message裡有了變化。如圖5所示。
圖5. 不合理的文件創建與刪除
由於打開文件對話框實際就是一個API調用。沒有像Reflactor一樣的簡單的方式去看它的實現。
而且在源代碼中,也加入了FileIOPermission來禁向監視文件中寫入。但是完全沒有效果。其實這也算是另一個安全漏洞。因為.NET Framework在調用API之前應該對相關Permission進行檢查。但是事實上沒有進行這樣的檢查。(也許MS有其它方面的考慮吧)
PS:WinForm中的打開文件對話框也有這樣的問題,所以也不能完全算WPF的BUG,但是畢竟在WPF的Assembly裡有這個問題,就放了進來。(沒有看代碼,應該是調用的一個API)