2013-05-16 5 views
0

Я использую StraemWriter для записи текстовых сообщений в файл журнала. Файл журнала должен быть создан, если он не существует, добавляется, если дата создания файла меньше определенного времени или воссоздана, если создана до этого времени. Я использую класс/код нижеStreamWriter, не записывающий данные

public static class LogIt 
{ 
    private const string LOG_FNAME = @"Logfile.log"; 

    public static void WriteMsg(string msg) 
    { 
     bool append = true; 
     if (File.Exists(LOG_FNAME)) 
     { 
      //DateTime delDate = DateTime.Now.AddDays(-1); 
      DateTime delDate = DateTime.Now.AddMinutes(-30); 
      DateTime fileCreatedDate = File.GetCreationTime(LOG_FNAME); 
      if (DateTime.Compare(fileCreatedDate, delDate) < 0) 
      { 
       Console.WriteLine("DELETE FILE"); 
       File.Delete(LOG_FNAME); 
      } 
     } 

     using (StreamWriter sw = new StreamWriter(LOG_FNAME, append)) 
     { 
      sw.WriteLine(msg); 
     } 

     Console.WriteLine(msg); 
    } 
} 

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

сообщение записываются следующим образом:

LogIt.WriteMsg("Log this message"); 

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

Любые идеи о том, почему?

+1

Пробовал отлаживать еще? – Renan

+0

Я воспроизвел ваш код, и он отлично работает, вы уверены, что проблема не в другом месте? –

+0

@Renen, я прошел через код и использовал console.writeline для вывода сообщений, и программа, похоже, работает, но когда файл будет удален, тогда созданный sw.Writeline не пишет текст, просто присутствует файл emtpy. – MPD

ответ

0

@MPD проблем нет. Вот реализация обходного пути, которое я предложил. Попробуйте и дайте мне знать, если это сработает.

private const string LOG_FNAME = @"Logfile.log"; 

     public static void WriteMsg(string msg) 
     { 
      bool deleted = false; 
      bool append = true; 
      if (File.Exists(LOG_FNAME)) 
      { 
       //DateTime delDate = DateTime.Now.AddDays(-1); 
       DateTime delDate = DateTime.Now.AddMinutes(-30); 
       DateTime fileCreatedDate = File.GetCreationTime(LOG_FNAME); 
       if (DateTime.Compare(fileCreatedDate, delDate) < 0) 
       { 
        Console.WriteLine("DELETE FILE"); 
        File.Delete(LOG_FNAME); 

        //record that file was deleted and a new one will be created 
        deleted = true; 
       } 
      } 

      using (StreamWriter sw = new StreamWriter(LOG_FNAME, append)) 
      { 

       sw.WriteLine(msg); 

      } 

      if (deleted) 
      { 
       //a new file is created. Make sure the creation time is set 
       FileInfo fi = new FileInfo(LOG_FNAME); 
       fi.CreationTime = DateTime.Now; 
      } 

      Console.WriteLine(msg); 
     } 
1

По какой-то причине файл имеет дату первоначального создания (первый раз, когда файл с указанным путем всегда был создан) в качестве даты создания, даже если он был восстановлен после удаления. Вы можете проверить свойства файла и посмотреть, что дата создания файла журнала всегда одинакова. Обходной задачей было бы обновить дату создания файла в коде всякий раз, когда вы воссоздаете файл. Вы можете использовать для этого класс FileInfo.

+0

[This] (http://msdn.microsoft.com/en-us/library/system.io.file.getcreationtime.aspx) Запись MSDN объясняет, как NTFS может кэшировать эту информацию. –

+0

@Rukshan Perera благодарит за информацию, но я могу получить, чтобы воссоздать с помощью файла f, но только любая последующая запись потока никогда не появляется. Я добавлю код для этого, но я не уверен, что это причина отсутствия записи. Спасибо также за ссылку MSDN 500-Internal .. – MPD

+0

@MPD Нет проблем. Вот реализация обходного пути, которое я предложил. Попробуйте и дайте мне знать, если это сработает. –

0

Я предполагаю, что вы используете этот код в Windows 2003 (или, может быть, XP). Если это так: когда вы создаете файл в какой-либо директории в момент времени T1 и удаляете его, а затем повторно его создаете; удивление удивляет, что T1 - дата создания!

Я знаю это только потому, что у меня была такая же проблема в Windows 2003!

BTW Я использую NLog сейчас и (ИМХО), это прекрасно и имеет все, что мне нужно.

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