Консольное приложение C # не записывает в файл при вызове из командной строки, но делает иначе

#c# #logging #console

#c# #ведение журнала #консоль

Вопрос:

У меня есть небольшое консольное приложение, которое принимает параметры. Через я использую метод для ввода некоторой информации в файл в виде журнала. Очень просто:

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

Однако, когда эта программа запускается с помощью вызова из командной строки, программа запускается, но файл журнала не изменяется.

Если приложение запускается путем запуска через проводник или отладки в Visual Studio, ведение журнала работает.

Есть идеи?

Комментарии:

1. Вероятно, проблема с разрешениями.

2. Вы запускались от имени администратора?

3. Вероятно, он записывает файл, но не в ту папку. Что произойдет, если вы используете абсолютный путь?

Ответ №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);
}
  

Комментарии:

1. Полагаю, мне следовало подумать об этом, просто чтобы исключить возможность устранения неполадок. Но я не вижу, как ‘c:appbindebuglog.txt «нет проблемы, из-за которой приложение, запущенное из каталога отладки, не может выполнить запись в «log.txt ‘.

2. Но это все рассортировало, спасибо за объяснение и пример кода, мне действительно нужно использовать path.combine вместо явной строки. Еще раз спасибо — отмечено как ответ за подробный ответ и пример кода.

Ответ №2:

Попробуйте определить полный путь записи, например: C:UsersuserDocumentslog.txt