我有一个日志对象,它使用相对路径写入每日日志文件。它相当简单(.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 并引发异常。但是,我无法使用对话框重现问题,我认为相对路径是相对于可执行文件?打开/保存文件对话框可以改变软件计算相对文件路径的方式吗?有人有什么想法?谢谢你的时间!
答案 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,即使应用程序因某种原因更改了文件夹,也不应该更改。