WinCE5.0移动平台开发笔记(XmlDocument.Load与OpenFileDialog对话框选择冲突引起的思考)
Posted on 2010-05-13 22:46 Charles Chen 阅读(2317) 评论(2) 编辑 收藏 举报一、起因:
一位同事在使用XmlDocument.Load("test.xml")方法加载xml文件时候,出现错误,错误是:test.xml文件找不到,也就是说程序找不到test.xml文件。
二、经过:
当出现这个毫无疑问的错误后,马上到应用程序的执行目录下去寻找是否存在test.xml文件。因为这里使用的相对路径,所以应当在当前程序执行目录下去寻找。但是奇怪的是应用程序的执行目录下是存在test.xml文件的,那为什么程序找不到文件了?难道是当前程序工作目录发生了变化,即用相对路径下找test.xml文件当然找不到了?但是为什么当前工作的文件夹目录发生了变化呢?经发现,是由于程序中使用了OpenFileDialog控件弹出打开文件对话框并选择一个文件后,那么当前工作的文件夹目录怎么跑到那OpenFileDialog最后一次所在的位置目录下呢?如果是那样的话,在那目录下怎么能找到test.xml文件呢,当然是无法找到的。
三、思考:
XmlDocument.Load()方法接收的参数路径如果是绝对路径的话,那没问题的。但如果是相对路径的话:会在当前工作的文件夹目录下去寻找相对路径下的文件,即是Environment.CurrentDirectory是当前工作的文件夹目录。
正常情况下使用Environment.CurrentDirectory时会得到当前的文件夹路径,但在特殊情况下也要注意:如果你用另外A程序调用B程序,B程序里的Environment.CurrentDirectory就会是A程序的路径。如果你用FoldBrowerDialog或OpenFileDialog等选择路径组件也会改变Environment.CurrentDirectory。因此当使用XmlDocument.Load()方法加载的是相对路径时候,会根据Environment.CurrentDirectory路径+相对路径去找对应加载的文件。因此:如果你用OpenFileDialog选择文件后,Environment.CurrentDirectory+相对路径就无法找到对应的文件了。当然也就提示加载不了。(类似的有File.Exist也会存在这个问题)
那么遇到这种情况的问题后应该怎么解决呢?
四、解决:
通过不断的尝试得出有两种解决方法能解决:
1.使用OpenFileDialog对话框中的RestoreDirectory属性,这个属性是:控制对话框在关闭之前是否恢复当前目录,默认是false。这里我们修改成true,或者使用OpenFileDialog.RestoreDirectory=true.表示关闭对话框之前恢复当前目录。
原理:这样Environment.CurrentDirectory能保持和打开之前的路径一样,当然当前工作的文件夹目录也就没有变化了。
2.XmlDocument.Load或File.Exist方法是用绝对路径:绝对路径用Application.StartupPath来获取应用程序执行文件的路径。
即Application.StartupPath+相对路径
五、总结:
C#.Net中有几个方法都可以获取当前文件的工作路径,这里整理一下:
1.Application.StartupPath:当前应用程序可执行文件的目录,不包括文件名
2.Application.ExcutablePath:当前应用程序可执行文件的目录,包括文件名
3.AppDomain.CurrentDomain.BaseDirectory:当前AppDomain中载入程序集的基本目录.
4.System.Environment.CurrentDirectory:当前工作的文件夹目录(注意什么情况下会发生变化)
5.System.IO.Directory.GetCurrentDirectory:当前工作的文件名目录(主要什么情况下会发生变化)
6.Assembly.GetExcutingAssembly().location:得到包含清单元数据文件目录
7.....继续补充.....
注意:如果用相对路径加载文件时,使用的是System.Environment.CurrentDirectory+相对路径=绝对路径 去寻找对应的文件。
说起不太直观:这里举一个示例来说明:
程序目录C:\Debug文件夹的可执行文件WindowFormsApplication2.exe,我们看看上面这几个路径获取的结果是什么:
1.Application.StartupPath: "C:\Debug"
2.Application.ExcutablePath: "C:\Debug\WindowFormsApplication2.exe"
3.AppDomain.CurrentDomain.BaseDirectory: "C:\Debug\"
4.System.Environment.CurrentDirectory: "C:\Debug"
5.System.IO.Directroy.GetCurrentDirectroy: "C:\Debug"
6.Assembly.GetExcutingAssembly().location: "C:\Debug\WindowFormsApplication2.exe"
六、测试环境:
以上环境是在Window XP上测试并得出的结果。
另外我在Window Vista下使用OpenFileDialog并不能改变System.Environment.CurrentDirectroy的路径,也就不会出现本文讨论的XmlDocument.Load文件加载与OpenFileDialog对话框的路径冲突问题。所以在Window Vista下本文的说的问题并不存在。
Best Regards,
Charles Chen
http://charles2008.cnblogs.com/