【问题标题】:C# Console App doesnt write to file when called by command line but does otherwiseC# 控制台应用程序在命令行调用时不写入文件,但不写入文件
【发布时间】:2019-03-11 16:28:28
【问题描述】:

我有一个带有参数的小型控制台应用程序。 Througout 我使用一种方法将一些信息作为日志放入文件中。很简单:

        static void Log(string str)
        {
            using (StreamWriter sw = new StreamWriter("log.txt", true))
            {
                sw.WriteLine(str);
            }
        }

但是,当这个程序通过命令行调用运行时,程序运行但日志文件没有被修改。

如果应用程序是通过资源管理器启动或在 Visual Studio 中调试运行的,则日志记录有效。

有什么想法吗?

【问题讨论】:

  • 可能是权限问题。
  • 您是否以管理员身份运行?
  • 可能正在写入文件,但写入了错误的文件夹。如果使用绝对路径会发生什么?

标签: c# logging console


【解决方案1】:

new StreamWriter("log.txt", true) 写入当前工作目录,该目录可能在任何地方,包括网络共享或您没有写入权限的地方。始终指定任何文件的完整路径。如果要写入文件,则需要确保写入您有权访问的位置。不要只以管理员身份运行您的应用,这会带来各种安全漏洞。

你可能想要这样的东西:

var p = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "myAppName");
if (!Directory.Exists(p)) Directory.CreateDirectory(p);
using (var sw = new StreamWriter(Path.Combine(p, "log.txt"), true)
{
    sw.WriteLine(str);
}

【讨论】:

  • 我想我应该想到这只是为了排除故障排除。但我看不出“c:\app\bin\debug\log.txt”如何没有问题,因为从调试目录运行的应用程序无法写入“log.txt”。
  • 但是已经排序了,谢谢你的解释和代码示例,我确实需要使用 path.combine 而不是显式字符串。再次感谢 - 标记为详细回复和代码示例的答案。
【解决方案2】:

尝试定义完整的写入路径,例如:C:\Users\user\Documents\log.txt

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-27
    • 2013-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-22
    • 1970-01-01
    相关资源
    最近更新 更多