C# 登录到应用程序文件夹中的文本文件

C# 登录到应用程序文件夹中的文本文件,c#,C#,我使用以下代码将应用程序的结果记录到一个.txt文件中 string path = Environment.CurrentDirectory.ToString() + "\\measurementslog.txt"; using (StreamWriter sw = File.AppendText(path)) { sw.WriteLine(accumulatedLines); } 应用程序的文件夹位于桌面上。日志是在applications文件夹中创建的。如果我结束日志记录过程并重新

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

string path = Environment.CurrentDirectory.ToString() + "\\measurementslog.txt";
using (StreamWriter sw = File.AppendText(path))
{
    sw.WriteLine(accumulatedLines);
}
应用程序的文件夹位于桌面上。日志是在applications文件夹中创建的。如果我结束日志记录过程并重新启动它,它有时会在桌面上(而不是应用程序文件夹中)创建一个单独的measurementslog.txt文件


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

CurrentDirectory
不是必需的可执行目录

如果希望它接近可执行文件,请使用此选项

System.Reflection.Assembly.GetEntryAssembly().Location;

您的应用程序中是否有任何内容更改了工作目录?而不是每次都使用Environment.CurrentDirectory。我建议使用一个只读字段(“StartFolder”),您可以在应用程序启动时使用Environment.CurrentDirectory初始化该字段。这样,如果有任何事情导致工作目录发生更改,您仍然拥有应用程序目录的完整路径。

您可以使用以下代码来实现您的结果

var programDirectory = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
var path = Path.Combine(programDirectory, @"log.txt");
File.AppendAllText(path, accumulatedLines);
不过要注意,它只能在独立的应用程序(例如控制台和桌面)中可靠地工作。例如,当您处于Web应用程序上下文或单元测试运行程序上下文中时,
Assembly.getExecutionGassembly()
可能会返回运行程序上下文的程序集,这对于开发人员来说可能是意外的


请注意,提供的代码未经测试,不包含适当的检查,仅表示为一个简短的演示片段。环境存在两个问题。
当前目录

  • 它可以更改:
    Environment.CurrentDirectory=@“C:\bla-bla-bla”
    
  • 用户不一定具有目录的写入权限;e、 g.
    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);
    

    使用log4net。。。。。。。或者任何记录系统。log4net或NLog都是不错的选择,但还有更多。如果像这样登录,他们会处理很多你必须自己做的事情。它们经过测试、稳定且易于配置。为什么要使用log4net或任何其他日志库将文本写入文件?:)当然,这些都是很好的库,了解它们很好,但请不要用20公斤的锤子来钉一个小钉子。@ZoltánTamási,因为OP谈论的是日志记录,但实际上只是写入一个文本文件。如果他想记录,我建议使用记录系统。如果他想写一个文本文件-好的。但他明确地说了“日志”,我建议为复杂的应用程序级日志场景提供一个日志库,但这两个“日志”需求之间可能存在差异。我只是说,如果它是一个简单的附加到硬编码文件,那么引入log4net就是一个过火的例子。然而,正如我所写,这绝对值得一提。