是什么导致正在执行的应用程序的当前目录更改?

时间:2020-03-06 14:58:54  来源:igfitidea点击:

我有一个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"

一旦应用程序运行,仅移动文件或者从预期位置删除该文件,便会导致此错误。

格雷格