[WPF Bug清单]之(3)——暗中创建文件的打开文件对话框
这个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)
同系列的其它文章:
[WPF Bug清单](序)与之(1)——可以多选的单选ListBox
[WPF Bug清单]之(2)——RadioButton的IsChecked绑定失效
[WPF Bug清单]之(4)——点击RadioButton的空白没有反应
[WPF Bug清单]之(5)——隐藏模态对话框后变成非模态
[WPF Bug清单]之(6)——Button的IsCancel属性失效
[WPF Bug清单]之(7)——顽固的Error Template