我正在使用以下代码将我的应用程序的结果记录到.txt文件中。
string path = Environment.CurrentDirectory.ToString() + "\\measurementslog.txt";
using (StreamWriter sw = File.AppendText(path))
{
sw.WriteLine(accumulatedLines);
}
应用程序的文件夹位于桌面上。日志在applications文件夹中创建。如果我结束日志记录过程并重新启动它,它有时会在桌面上创建一个单独的measurementslog.txt文件(而不是在应用程序文件夹中)。
有人会知道,为什么会这样?
答案 0 :(得分:3)
您可以使用以下代码来获得结果。
var programDirectory = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
var path = Path.Combine(programDirectory, @"log.txt");
File.AppendAllText(path, accumulatedLines);
请注意,它仅在独立应用程序(例如控制台和桌面)中可靠地运行。例如,当您在Web应用程序上下文或单元测试运行器上下文中时,Assembly.GetExecutingAssembly()
可能会返回运行器上下文的程序集,这对于开发人员来说可能是意外的。
请注意,提供的代码未经过测试,不包含相应的检查,仅作为简短的演示代码段。
答案 1 :(得分:2)
Environment.CurrentDirectory
存在两个问题:
Environment.CurrentDirectory = @"C:\bla-bla-bla";
因此当前目录不一定是程序启动的路径C:\Program Files
(安装应用程序的典型位置)通常无法编写,除非用户具有高级用户或管理员角色。 我建议使用日志的标准路径:System.Environment.SpecialFolder.LocalApplicationData
这样的事情:
//TODO: Put a better name for the log file (not log.txt)
// E.g. $"{Assembly.GetEntryAssembly().GetName().Name}.log.txt"
// You may want to create a subfolder, say \Logs\ as well
File.AppendAllText(
Path.Combine(System.Environment.SpecialFolder.LocalApplicationData, "log.txt"),
accumulatedLines);
答案 2 :(得分:0)
CurrentDirectory
不是必需的可执行目录,
如果您希望它接近可执行文件
,请使用此选项System.Reflection.Assembly.GetEntryAssembly().Location;
答案 3 :(得分:0)
您应用中的任何内容都会更改工作目录吗?而不是每次都使用Environment.CurrentDirectory。我建议有一个只读字段(" StartFolder"),在应用程序开始时,你用Environment.CurrentDirectory初始化。这样,如果有任何内容导致工作目录发生变化,您仍然拥有应用程序目录的完整路径。