2014-01-23 3 views
4

У меня есть следующая функция, которая принимает строку и записывает содержимое строки в файл журнала.StreamWriter не пишет в файл при вызове из задачи Scheduler C#

private static void LogEvent(string sEvent) 
{ 
     sEvent = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss") + "|" + sEvent; 

     Console.WriteLine(sEvent); 

     try 
     { 
      using (StreamWriter oStreamWriter = new System.IO.StreamWriter("MyService_" + DateTime.Now.ToString("yyyyMMdd") + ".log", true)) 
      { 
       oStreamWriter.WriteLine(sEvent); 
      } 
     } 
     catch 
     { 

     } 
} 

Когда программа вызова функции вручную запустить из командной строки или двойным щелчком исполняемого файла журнала либо создается или добавляется к.

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

Запланированное задание вызывает программу, используя те же права пользователя, что и при ручном запуске программы.

Почему это происходит, и как я могу это исправить.

+1

Если вы не скрывали исключение с предложением о пустое уловку, возможно, вам будет лучше понять, как его исправить. – Joe

ответ

10

В настоящее время вы пытаетесь записать текущий рабочий каталог процесса, который может быть чем-то вроде C:\Windows\System32, когда он выполняется планировщиком задач. Вы не сможете писать там.

Укажите абсолютное имя файла, и я думаю, что с вами все будет в порядке. Неясно, где вы do хотите написать, но вы должны тщательно об этом подумать - в идеале вы должны отделять свои исполняемые файлы от данных, которые он генерирует. Рассмотрите возможность использования Environment.GetFolderPath в сочетании с подходящим SpecialFolder элементом (например ApplicationData.)

Обратите внимание, что с помощью File.AppendAllText бы сделать код более простым, заметьте.

+0

Спасибо, это была проблема. Я заметил, что мне удалось получить начальный путь приложения с помощью Application.StartupPath – Tommassiov

2

Ответ на Jon Skeet является правильным, что проблема с разрешением рабочего каталога, и вы должны использовать SpecialFolder писать журналы, но я хотел бы добавить еще один пункт,
не Никогда пустые catch блоков, как вы делали catch { } для меня это catch заявления когда-то скрывают так много неизвестных проблем.

Я думаю, что они что-то вроде тизера, который говорит,

catch 
{ 
    // WHO CARES 
} 

Никогда не прячьте такого рода исключений под ковром, предпринимают определенные действия или сообщить конечному пользователю или флаг где-то, что произошло. Это поможет разработчику на более поздних этапах.

+2

. В крайнем случае, исключения, которые вы хотите отстранить от _go, должны быть зарегистрированы в «Trace» или другом мещанстве в журнале, чтобы вы могли видеть их, если есть большая проблема , – Gusdor

Смежные вопросы