2

我有一个包含以下代码的 C# 应用程序:

string file = "relativePath.txt";

//Time elapses...

string contents = File.ReadAllText(file);

这在大多数情况下都可以正常工作。该文件是相对于应用程序启动的目录读取的。但是在测试中发现,如果放置5个小时左右,app会抛出FileNotFoundException“C:\Documents and Settings\Adminstrator\relativePath.txt”的提示找不到。但是,如果读取文件的操作立即运行,则会从正确的位置读取文件,我们将其称为“C:\foo\relativePath.txt”

是什么赋予了?而且,最好的解决办法是什么?解决文件反对Assembly.GetEntryAssembly().Location

4

6 回答 6

7

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

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

于 2008-10-01T15:35:28.397 回答
5

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

于 2008-10-01T15:32:44.750 回答
2

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

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

于 2008-10-01T15:33:03.610 回答
1

在 System.Environment 中,您有SpecialFolder枚举,这将帮助您获得标准的相对路径。

至少通过这种方式,路径是在内部获取并返回给您的,因此希望如果系统以某种方式更改路径,代码会处理它。

于 2008-10-01T15:36:46.770 回答
1

如果你做类似的事情

> cd c:\文件夹 1

c:\文件夹 1 > ../文件夹 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 目录中打开命令提示符并执行

bin/调试 > CWD.exe

然后做

bin/debug > cd ../../ > bin/debug/CWD.exe

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

关于原始问题......“如果单独放置大约 5 小时,应用程序将抛出 FileNotFoundException”

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

格雷格

于 2008-10-01T15:44:49.417 回答
0

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

于 2008-10-01T15:36:45.537 回答