1

我有一个日志对象,它使用相对路径写入每日日志文件。这相当简单(.NET 4.0,VS 2010)。

public void LogLine(string txt)
{
    DateTime dt = DateTime.Now;
    if (CurrentDay != dt.Day)
    {
        string newFileName = "..\\Log\\" + programName + dt.Day + ".log";
        fs = new FileStream(newFileName, FileMode.Create, FileAccess.Write);
        sw = new StreamWriter(fs);
        CurrentDay = dt.Day;
    }
    sw.WriteLine(txt);
}

这几乎一直有效。但是,有时我会得到一个看似随机的DirectoryNotFoundException,但路径完全不同。例如,当我第一次运行程序时,它会创建一个文件:

C:\MyFiles\Log\MyApp19.log

在使用了一些程序并让它在一夜之间运行以便创建一个新文件和流之后(在午夜之后的第一个日志中),我回到DirectoryNotFoundException,说明如下:

C:\MyFiles\MyOtherFiles\Resources\Log\MyApp20.log

我唯一能想到的是:在软件的整个生命周期中,我多次使用 OpenFileDialog 和 SaveFileDialog,其中一个打开/保存对话框访问其中的文件

C:\MyFiles\MyOtherFiles\Resources\SavedFiles\

所以在我看来,当我使用对话框时,我打开/保存一些东西到SavedFiles目录中,当它创建新日志时,相对文件路径..\上升到Resources(来自SavedFiles),然后找不到Resources中的目录Log并引发异常。但是,我无法使用对话框重现问题,并且我认为相对路径是相对于可执行文件的?打开/保存文件对话框能否改变软件计算相对文件路径的方式?有人有什么想法吗?谢谢你的时间!

4

3 回答 3

3

我认为以下链接可以帮助您:

http://msdn.microsoft.com/en-us/library/system.windows.forms.filedialog.aspx

注意以下部分:

重要提示:如果您的应用程序的用户更改了 FileDialog 中的文件夹,那么您的应用程序的当前工作目录将设置为 FileDialog 中指定的位置。为防止出现这种情况,请将 RestoreDirectory 属性设置为 true。

尝试使用 Microsoft 提出的路径方法,如上述链接中所述。

这也可以帮助您 http://msdn.microsoft.com/en-us/library/system.windows.forms.application.executablepath.aspx

问候

于 2013-02-20T15:36:52.733 回答
2

相对路径始终适用于应用程序的当前目录。这很容易改变,例如当您显示保存对话框时。
创建相对于可执行文件的路径总是更好。

var assembly = Assembly.GetEntryAssembly() ?? Assembly.GetCallingAssembly();
var path = Path.GetDirectoryName(assembly.Location);
newFileName = Path.Combine(path,  "..\\Log\\" + programName + dt.Day + ".log");
于 2013-02-20T15:29:42.983 回答
1

我猜测应用程序会在某个时候更改当前工作目录。因此,在此基础上,我会为日志文件使用完全限定的路径。您可以使用程序集的启动路径,例如 Application.StartupPath,即使应用程序出于某种原因更改了文件夹,它也不应该更改。

于 2013-02-20T15:32:58.120 回答