2016-03-25 3 views
1

У меня есть решение для регистрации и запись в текстовый файл, который открыт при запуске приложения. Я использую StreamWriter для записи в файл. Мой регистратор код просто (чтобы открыть поток и писать):Дата Модифицировано не обновляется, пока StreamWriter открыт

public void Open(string filePath, bool append) 
    { 
     if (this.logWriter != null) 
      throw new InvalidOperationException(
       "Logger is already open"); 

     if (!Directory.Exists(Path.GetDirectoryName(filePath))) 
      Directory.CreateDirectory(Path.GetDirectoryName(filePath)); 

     this.logWriter = new StreamWriter(filePath, append); 
     this.logWriter.AutoFlush = true; 
    } 

public void CreateEntry(string entry) 
    { 
     if (this.logWriter == null) 
      return; 

     this.logWriter.WriteLine(entry); 

    } 

Проблема заключается в том, что при записи в файл, данные записываются, размер файла меняется, но «Date Modified» атрибут не изменяется. Есть предположения? Как я могу вручную обновить дату изменения?

PS: Я на Windows 7

ответ

2

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

Он обновляется каждый раз, когда дескриптор файла закрывается. *

Вы всегда можете получить последнюю актуальную информацию с помощью GetFileInformationByHandle или GetFileInformationByHandleEx. Чтобы использовать эту функцию, вы должны открыть файл, используя CreateFile, не запрашивая ни права на чтение, ни запись, а также возможность совместного использования.

HANDLE hFile = CreateFile(_T("Path/To/File"), 
    0, // No read or write access needed 
    FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, 
    NULL, 
    OPEN_EXISTING, // Don't create 
    0, NULL); 

Эта ручка затем может использоваться с GetFileInformationByHandleEx.

Альтернативно простое закрытие этого дескриптора обновит запись в каталоге, чтобы отразить текущие значения.

* (Чтобы быть точным, когда ручка, которая была открыта через это имя закрыто, так как файл может иметь несколько жестких ссылок.)

+0

Спасибо за подробное объяснение –

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