是什么导致正在执行的应用程序的当前目录更改?
我有一个C应用程序,其中包含以下代码:
string file = "relativePath.txt"; //Time elapses... string contents = File.ReadAllText(file);
在大多数情况下,这都可以正常工作。相对于从其启动应用程序的目录读取文件。但是,在测试中,发现如果单独放置约5个小时,该应用程序将抛出FileNotFoundException
,表示找不到" C:\ Documents and Settings \ Adminstrator \ relativePath.txt"。如果立即执行读取文件的操作,则会从正确的位置读取文件,我们将其称为" C:\ foo \ relativePath.txt"
是什么赋予了?而且,最好的解决方法是什么?使用Assembly.GetEntryAssembly()。Location
解析文件?
解决方案
如果文件始终在相对于可执行程序集的路径中,则可以,请使用Assembly.Location。如果适用,我主要使用Assembly.GetExecutingAssembly来代替Assembly.GetEntryAssembly。这意味着,如果我们要从DLL访问文件,则该路径将相对于DLL路径。
我认为该课程不应依赖于相对路径,它们容易出错。当前目录可以在运行过程中通过文件对话框进行任何更改(尽管有一个属性可以阻止它们更改),因此,除非我们使用从已知路径(例如,从Visual Studio启动时要提防)或者其他某些已知路径(例如,当心)中生成固定路径的相对路径。
使用相对路径将使代码难以维护,因为项目的完全不相关的部分中的更改可能导致另一部分失败。
可以更改路径的一个怪异地方是OpenFileDialog。当用户在文件夹之间导航时,会将应用程序目录更改为当前正在查看的目录。如果用户在其他目录中关闭对话框,则我们将被卡在该目录中。
它具有一个称为RestoreDirectory的属性,该属性使对话框重置路径。但我相信默认值为" false"。
如果我们使用openfiledialog并且记住路径属性(不确定确切名称)为true,那么我认为它将更改当前目录。
在System.Environment中,我们具有SpecialFolder枚举,它将获取标准的相对路径。
至少通过这种方式,路径是在内部获取并交还给,因此希望如果系统以某种方式更改了路径,则代码将对其进行处理。
如果你喜欢
cd c:\文件夹1
c:\ folder 1> ../folder 2 / theApplication.exe
该应用程序的当前工作目录为c:\ folder 1.
这是一个示例程序
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows.Forms; namespace CWD { class Program { static void Main (string[] args) { Console.WriteLine(Application.StartupPath); } } }
在visualstudio中进行构建,然后在debug / bin目录中打开命令提示符,然后执行
垃圾桶/调试> CWD.exe
然后做
bin / debug> cd ../../
bin / debug / CWD.exe
我们会在启动路径中看到差异。
关于原始问题...
"如果单独放置约5个小时,应用程序将抛出FileNotFoundException"
一旦应用程序运行,仅移动文件或者从预期位置删除该文件,便会导致此错误。
格雷格