相对路径变化?

时间:2013-02-20 15:25:57

标签: c# .net path directory filestream

我有一个日志对象,它使用相对路径写入每日日志文件。它相当简单(.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 \资源\ LOG \ MyApp20.log

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

中的文件

C:\ MyFiles \ MyOtherFiles \ Resources \ SavedFiles \

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

3 个答案:

答案 0 :(得分:3)

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

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

问候

答案 1 :(得分:2)

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

var assembly = Assembly.GetEntryAssembly() ?? Assembly.GetCallingAssembly();
var path = Path.GetDirectoryName(assembly.Location);
newFileName = Path.Combine(path,  "..\\Log\\" + programName + dt.Day + ".log");

答案 2 :(得分:1)

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