Прикол с временем создания файла
От: tyomchick Россия  
Дата: 20.10.16 14:21
Оценка:
Есть у меня логер, который ведет журналы в виде файлов ограниченного размера.
Как только файл журнала достигает ограничения, он переименовывается (имя формируется из времени создания файла) и создается новый файл.

File.Move(_currentFileName, archFileName);
_writeStream = new FileStream(_currentFileName, FileMode.Create, 
    FileAccess.Write, FileShare.Read);


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

ОС Win7

В чем прикол и как можно победить?
Я понимаю, что вероятно проблема не .Net, просто проверять на других языках счас не хочется.
Аналогичный логер, на Delphi, где пользуется CreateFile, проблем не имеет таких.
Даже самую простую задачу можно сделать невыполнимой, если провести достаточное количество совещаний
Re: Прикол с временем создания файла
От: Sharov Россия  
Дата: 20.10.16 14:31
Оценка: -1
Здравствуйте, tyomchick, Вы писали:

T>Есть у меня логер, который ведет журналы в виде файлов ограниченного размера.

T>Как только файл журнала достигает ограничения, он переименовывается (имя формируется из времени создания файла) и создается новый файл.

T>
T>File.Move(_currentFileName, archFileName);
T>_writeStream = new FileStream(_currentFileName, FileMode.Create, 
T>    FileAccess.Write, FileShare.Read);
T>


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

T>Причем, иногда если ставлю точку останова на второй строчке и пройдя ее интересуюсь временем создания вновь созданного файла, то оно оказывается
T>адекватным, а иногда и нет.

T>ОС Win7


T>В чем прикол и как можно победить?

T>Я понимаю, что вероятно проблема не .Net, просто проверять на других языках счас не хочется.
T>Аналогичный логер, на Delphi, где пользуется CreateFile, проблем не имеет таких.

File.Move просто копирует файл, оставляя на прежнем месте.
new FileStream(_currentFileName, FileMode.Create...) -- если не ошибаюсь, просто "зануляет" сущ. файл, т.е. не создает его.
Попроубуйте в промежутке между вызовами удалить файл currentFileName.
Кодом людям нужно помогать!
Re: Прикол с временем создания файла
От: Sinix  
Дата: 20.10.16 14:32
Оценка: 189 (8) +1
Здравствуйте, tyomchick, Вы писали:

T>В чем прикол и как можно победить?

https://blogs.msdn.microsoft.com/oldnewthing/20050715-14/?p=34923
http://dfstream.blogspot.ru/2012/02/file-system-tunneling-in-windows.html
http://stackoverflow.com/questions/2109152/unbelievable-strange-file-creation-time-problem
?
Re[2]: Прикол с временем создания файла
От: Sharov Россия  
Дата: 20.10.16 14:40
Оценка:
Здравствуйте, Sinix, Вы писали:

S>Здравствуйте, tyomchick, Вы писали:


T>>В чем прикол и как можно победить?

S>https://blogs.msdn.microsoft.com/oldnewthing/20050715-14/?p=34923
S>http://dfstream.blogspot.ru/2012/02/file-system-tunneling-in-windows.html
S>http://stackoverflow.com/questions/2109152/unbelievable-strange-file-creation-time-problem
S>?

Допустим, но

Аналогичный логер, на Delphi, где пользуется CreateFile, проблем не имеет таких.

Кодом людям нужно помогать!
Re[3]: Прикол с временем создания файла
От: Sinix  
Дата: 20.10.16 14:43
Оценка:
Здравствуйте, Sharov, Вы писали:

S>Допустим, но

S>Аналогичный логер, на Delphi, где пользуется CreateFile, проблем не имеет таких.
Ну так я ж не зря вопросительный знак поставил

Будут другие варианты — вэлкам, я ничего похожего больше не припомню.
Re[3]: Прикол с временем создания файла
От: tyomchick Россия  
Дата: 20.10.16 14:59
Оценка:
Здравствуйте, Sharov, Вы писали:

S>Здравствуйте, Sinix, Вы писали:


S>>Здравствуйте, tyomchick, Вы писали:


T>>>В чем прикол и как можно победить?

S>>https://blogs.msdn.microsoft.com/oldnewthing/20050715-14/?p=34923
S>>http://dfstream.blogspot.ru/2012/02/file-system-tunneling-in-windows.html
S>>http://stackoverflow.com/questions/2109152/unbelievable-strange-file-creation-time-problem
S>>?

S>Допустим, но

S>

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, так как файл уже открыт и расшарено только чтение.
Даже самую простую задачу можно сделать невыполнимой, если провести достаточное количество совещаний
Re[2]: Прикол с временем создания файла
От: tyomchick Россия  
Дата: 20.10.16 15:57
Оценка:
Здравствуйте, Sinix, Вы писали:

S>Здравствуйте, tyomchick, Вы писали:


T>>В чем прикол и как можно победить?

S>https://blogs.msdn.microsoft.com/oldnewthing/20050715-14/?p=34923
S>http://dfstream.blogspot.ru/2012/02/file-system-tunneling-in-windows.html
S>http://stackoverflow.com/questions/2109152/unbelievable-strange-file-creation-time-problem
S>?

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

File.Move(_currentFileName, archFileName);
var fileInfo = new FileInfo(_currentFileName);
fileInfo.OpenWrite().Close();
fileInfo.CreationTime = DateTime.Now;
_writeStream = new FileStream(_currentFileName, FileMode.Create,
    FileAccess.Write, FileShare.Read);


Неприятно конечно, в пишущем потоке хочется сэкономить по максимуму.
Даже самую простую задачу можно сделать невыполнимой, если провести достаточное количество совещаний
Отредактировано 20.10.2016 16:42 tyomchick . Предыдущая версия . Еще …
Отредактировано 20.10.2016 16:41 tyomchick . Предыдущая версия .
Re[4]: Прикол с временем создания файла
От: Sharov Россия  
Дата: 20.10.16 16:24
Оценка:
Здравствуйте, Sinix, Вы писали:

S>Здравствуйте, Sharov, Вы писали:


S>>Допустим, но

S>>Аналогичный логер, на Delphi, где пользуется CreateFile, проблем не имеет таких.
S>Ну так я ж не зря вопросительный знак поставил

S>Будут другие варианты — вэлкам, я ничего похожего больше не припомню.


Мда, круто, благодарю за инф-ию И самое интересное, что мой совет с удалением в этом случае не помогает

These paired operations can cause tunneling on "name."

delete(name)/create(name)

Кодом людям нужно помогать!
Re[3]: Прикол с временем создания файла
От: Sinix  
Дата: 20.10.16 17:01
Оценка:
Здравствуйте, 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 нативный можно вызвать.
Пример.
Re[4]: Прикол с временем создания файла
От: tyomchick Россия  
Дата: 21.10.16 09:02
Оценка:
Здравствуйте, Sinix, Вы писали:

T>>Не нашел способа установить время создания не открывая файл дважды.

S>SetFileTime нативный можно вызвать.
S>Пример.

У нас unsafe запрещен.
В общем посмотрю, возможно просто сделаю текущему логу инкрементальное имя.
Даже самую простую задачу можно сделать невыполнимой, если провести достаточное количество совещаний
Re[5]: Прикол с временем создания файла
От: hardcase Пират http://nemerle.org
Дата: 24.10.16 16:57
Оценка:
Здравствуйте, tyomchick, Вы писали:

T>>>Не нашел способа установить время создания не открывая файл дважды.

S>>SetFileTime нативный можно вызвать.
S>>Пример.

T>У нас unsafe запрещен.


А где там unsafe?
/* иЗвиНите зА неРовнЫй поЧерК */
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.