【问题标题】:Relative path changing?相对路径改变?
【发布时间】:2013-02-05 16:10:00
【问题描述】:

我有一个日志对象,它使用相对路径写入每日日志文件。这相当简单(.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并抛出异常。但是,我无法使用对话框重现问题,并且我认为相对路径是相对于可执行文件的?打开/保存文件对话框能否改变软件计算相对文件路径的方式?有人有什么想法吗?感谢您的宝贵时间!

【问题讨论】:

  • 看看这个question。当您使用OpenFileDialog 时,您的工作目录会发生变化。
  • @HuorSwords 谢谢,我对“工作目录”这个词太天真了。对我来说有趣的是,如果我在对话前后打印 Directory.GetCurrentDirectory() ,两个打印件是相同的。但是,问题肯定来自其中一个对话框。我确信恢复目录会起作用,但是无法重现我遇到的问题很烦人!

标签: c# .net path directory filestream


【解决方案1】:

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

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

问候

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2012-01-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-11
        • 2010-09-15
        • 2013-04-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多