Есть у меня логер, который ведет журналы в виде файлов ограниченного размера.
Как только файл журнала достигает ограничения, он переименовывается (имя формируется из времени создания файла) и создается новый файл.
File.Move(_currentFileName, archFileName);
_writeStream = new FileStream(_currentFileName, FileMode.Create,
FileAccess.Write, FileShare.Read);
Проблема в том, что почему-то все файлы получаются с одним и тем же временем создания, т.е. временем создания первого файла после запуска программы.
Причем, иногда если ставлю точку останова на второй строчке и пройдя ее интересуюсь временем создания вновь созданного файла, то оно оказывается
адекватным, а иногда и нет.
ОС Win7
В чем прикол и как можно победить?
Я понимаю, что вероятно проблема не .Net, просто проверять на других языках счас не хочется.
Аналогичный логер, на Delphi, где пользуется CreateFile, проблем не имеет таких.
Даже самую простую задачу можно сделать невыполнимой, если провести достаточное количество совещаний
Здравствуйте, tyomchick, Вы писали:
T>Есть у меня логер, который ведет журналы в виде файлов ограниченного размера. T>Как только файл журнала достигает ограничения, он переименовывается (имя формируется из времени создания файла) и создается новый файл.
T>
T>Проблема в том, что почему-то все файлы получаются с одним и тем же временем создания, т.е. временем создания первого файла после запуска программы. T>Причем, иногда если ставлю точку останова на второй строчке и пройдя ее интересуюсь временем создания вновь созданного файла, то оно оказывается T>адекватным, а иногда и нет.
T>ОС Win7
T>В чем прикол и как можно победить? T>Я понимаю, что вероятно проблема не .Net, просто проверять на других языках счас не хочется. T>Аналогичный логер, на Delphi, где пользуется CreateFile, проблем не имеет таких.
File.Move просто копирует файл, оставляя на прежнем месте.
new FileStream(_currentFileName, FileMode.Create...) -- если не ошибаюсь, просто "зануляет" сущ. файл, т.е. не создает его.
Попроубуйте в промежутке между вызовами удалить файл currentFileName.
Здравствуйте, Sharov, Вы писали:
S>Допустим, но S>Аналогичный логер, на Delphi, где пользуется CreateFile, проблем не имеет таких.
Ну так я ж не зря вопросительный знак поставил
Будут другие варианты — вэлкам, я ничего похожего больше не припомню.
S>Аналогичный логер, на Delphi, где пользуется CreateFile, проблем не имеет таких.
Сейчас глянул свой древний дельфовый логер, там действительно есть явная установка времени
m_hFile := CreateFile(PChar(m_sLogFileName), GENERIC_WRITE, FILE_SHARE_READ,
nil, OPEN_ALWAYS, 0, 0);
if m_hFile <> 0 then
begin
if bNew then
begin
GetSystemTime(stCreateTime);
SystemTimeToFileTime(stCreateTime, ftCreateTime);
Windows.SetFileTime(m_hFile, @ftCreateTime, nil, nil);
end;
m_iFilePos := SetFilePointer(m_hFile, 0, nil, FILE_END);
if bStart then
WriteSelfRecord(c_MSG_START_WRITE);
end;
Видимо я с такой проблемой сталкивался уже, но она сразу решилась.
Тут я так же сразу поступил, но не смог установить время создания функцией File.SetCreationTime, так как файл уже открыт и расшарено только чтение.
Даже самую простую задачу можно сделать невыполнимой, если провести достаточное количество совещаний
Здравствуйте, Sinix, Вы писали:
S>Здравствуйте, Sharov, Вы писали:
S>>Допустим, но S>>Аналогичный логер, на Delphi, где пользуется CreateFile, проблем не имеет таких. S>Ну так я ж не зря вопросительный знак поставил
S>Будут другие варианты — вэлкам, я ничего похожего больше не припомню.
Мда, круто, благодарю за инф-ию И самое интересное, что мой совет с удалением в этом случае не помогает
These paired operations can cause tunneling on "name."
Здравствуйте, tyomchick, Вы писали:
T>Спасибо, не знал о таких заморочках. T>Однако хорошего решения так и не нашел.
третья ссылка в предыдущем ответе
I think you can create a new filename first, then rename old->old.1, then new->old, and it'll "work". I don't remember honestly what we did when we ran into this last a few years back.
или
What we used was the File.SetCreationTime method, and as its name suggests, it easily let us control the creation date of the file, allowing us to set it to DateTime.Now. The rest of our logic worked correctly afterwards.
T>Не нашел способа установить время создания не открывая файл дважды.
SetFileTime нативный можно вызвать. Пример.
Здравствуйте, tyomchick, Вы писали:
T>>>Не нашел способа установить время создания не открывая файл дважды. S>>SetFileTime нативный можно вызвать. S>>Пример.
T>У нас unsafe запрещен.