CharlesChen's Technical Space

简单实用是我一直在软件开发追求的目标(I Focus on. Net technology, to make the greatest efforts to enjoy the best of life.)
Not the best, only better
  博客园  :: 首页  :: 联系 :: 订阅 订阅  :: 管理

    一、起因:

    一位同事在使用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/