什么会导致正在执行的应用程序的当前目录发生更改

本文关键字:当前目录 应用程序 执行 什么 | 更新日期: 2023-09-27 17:47:22

我有一个包含以下代码的 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解析文件?

什么会导致正在执行的应用程序的当前目录发生更改

一个可以改变你路径的幽灵般的地方是OpenFileDialog。 当用户在文件夹之间导航时,它会将您的应用程序目录更改为当前正在查看的目录。 如果用户在不同的目录中关闭对话框,那么您将被困在该目录中。

它具有一个名为RestoreDirectory的属性,该属性会导致对话框重置路径。 但我相信默认是"假的"。

如果文件始终位于相对于可执行程序集的路径中,则使用Assembly.Location。如果适用,我主要使用Assembly.GetExecutingAssembly,而不是Assembly.GetEntryAssembly。这意味着,如果从 DLL 访问文件,则路径将相对于 DLL 路径。

我认为教训应该是不要依赖相对路径,它们容易出错。当前目录可以通过正在运行的进程中的任意数量的东西来更改,例如文件对话框(尽管有一个属性可以防止它们更改它),因此您永远无法真正保证相对路径将始终通向何处,除非您使用相对路径从已知路径(如 Application.StartupPath)生成固定路径(尽管从 Visual Studio 启动时要小心)或其他一些已知路径。

使用相对路径会使代码难以维护,因为项目中完全不相关的部分的更改可能会导致另一部分失败。

在System.Environment中,你有SpecialFolder枚举,它可以帮助你获得标准的相对路径。

这样,至少,路径

是在内部获取并交还给你的,所以希望如果系统以某种方式更改路径,代码只会处理它。

如果你做一些类似的事情

> cd c:''folder 1

c:''文件夹 1> ../文件夹 2/应用程序.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);
        }
    }
}

在可视化工作室中构建它,然后在调试/bin 目录中打开命令提示符并执行

bin/debug> CWD.exe

然后做

bin/debug> cd ../../>箱/调试/CWD.exe

您将看到启动路径的差异。

关于最初的问题..."如果单独放置大约 5 小时,应用程序将抛出 FileNotFoundException"

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

格雷格

如果您

使用 openfiledialog 并且记住路径属性(不确定确切名称)为 true,那么我认为它会更改您当前的目录。