C# 相对路径改变?
我有一个日志对象,它使用相对路径写入每日日志文件。与2010年相比,它相当简单.NET4.0C# 相对路径改变?,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
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,两种打印都是相同的。然而,问题肯定来自其中一个对话。我确信恢复目录会起作用,但无法重现我遇到的问题是令人恼火的!