Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 相对路径改变?_C#_.net_Path_Directory_Filestream - Fatal编程技术网

C# 相对路径改变?

C# 相对路径改变?,c#,.net,path,directory,filestream,C#,.net,Path,Directory,Filestream,我有一个日志对象,它使用相对路径写入每日日志文件。与2010年相比,它相当简单.NET4.0 public void LogLine(string txt) { DateTime dt = DateTime.Now; if (CurrentDay != dt.Day) { string newFileName = "..\\Log\\" + programName + dt.Day + ".log"; fs = new FileStream

我有一个日志对象,它使用相对路径写入每日日志文件。与2010年相比,它相当简单.NET4.0

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目录中,当它创建新日志时,相对文件路径..\会从SavedFiles上升到资源,然后在资源中找不到目录日志,并引发异常。但是,我无法使用对话框重现问题,我认为相对路径是相对于可执行文件的?打开/保存文件对话框能否改变软件计算相对文件路径的方式?有人有什么想法吗?谢谢你的时间

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

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

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

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

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

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

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

请注意以下部分:

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

尝试使用Microsoft建议的路径方法,如上面链接中所述

这对你也有帮助


关于

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

请注意以下部分:

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

尝试使用Microsoft建议的路径方法,如上面链接中所述

这对你也有帮助


问候

看看这个。当您使用OpenFileDialog时,您的工作目录已更改。@谢谢,我对“工作目录”这个术语很幼稚。我感兴趣的是,如果我在对话框之前和之后打印Directory.GetCurrentDirectory,两种打印都是相同的。然而,问题肯定来自其中一个对话。我确信恢复目录会起作用,但无法重现我遇到的问题是令人恼火的!看看这个。当您使用OpenFileDialog时,您的工作目录已更改。@谢谢,我对“工作目录”这个术语很幼稚。我感兴趣的是,如果我在对话框之前和之后打印Directory.GetCurrentDirectory,两种打印都是相同的。然而,问题肯定来自其中一个对话。我确信恢复目录会起作用,但无法重现我遇到的问题是令人恼火的!