记录到application文件夹中的文本文件

时间:2017-09-05 07:01:14

标签: c#

我正在使用以下代码将我的应用程序的结果记录到.txt文件中。

string path = Environment.CurrentDirectory.ToString() + "\\measurementslog.txt";
using (StreamWriter sw = File.AppendText(path))
{
    sw.WriteLine(accumulatedLines);
}

应用程序的文件夹位于桌面上。日志在applications文件夹中创建。如果我结束日志记录过程并重新启动它,它有时会在桌面上创建一个单独的measurementslog.txt文件(而不是在应用程序文件夹中)。

有人会知道,为什么会这样?

4 个答案:

答案 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存在两个问题:

  1. 可以更改Environment.CurrentDirectory = @"C:\bla-bla-bla";因此当前目录不一定是程序启动的路径
  2. 用户不一定拥有目录的写权限;例如C:\Program Files(安装应用程序的典型位置)通常无法编写,除非用户具有高级用户管理员角色。
  3. 我建议使用日志的标准路径: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初始化。这样,如果有任何内容导致工作目录发生变化,您仍然拥有应用程序目录的完整路径。