2015-02-02 4 views
2

Я пытаюсь переименовать файл журнала с именем appname.log в форму appname_DDMMYY.log для целей архивирования и воссоздать пустой файл appname.log для дальнейшей записи. При выполнении этого в Windows 7 с использованием C++ и вызовов WinAPI или Qt (которые могут быть одинаковыми внутри) вновь созданный файл .log странно наследует временные метки (последние изменения, созданные) из переименованного файла. Это поведение наблюдается также при переименовании файла в Проводнике Windows и создании файла с тем же именем быстро в том же каталоге. Но это нужно делать быстро. После нажатия на «новый текстовый файл» отметки времени являются нормальными, но после переименования они изменяются на отметки времени, в которых был переименованный файл.Странное дублирование временной метки при переименовании и воссоздании файла

Это что-то вроде ошибки? Как я могу переименовать файл и воссоздать его вскоре после этого, не потеряв временные метки?

+0

Я вижу один и тот же вопрос. В моем случае код написан на python. Только в Windows. Тот же код, но работа на Mac не имеет этой проблемы. – Potrebic

ответ

0

Вот простой питон скрипт, который Репрографический это вопрос о моей 64-битной системе Windows7:

import time 
import os 

def touch(path): 
    with open(path, 'ab'): 
     os.utime(path, None) 

touch('a') 
print " 'a' timestamp: ", os.stat('a').st_ctime 
os.rename('a', 'a-old') 
time.sleep(15) 
touch('a') 
print "new 'a' timestamp: ", os.stat('a').st_ctime 

os.unlink('a') 
os.unlink('a-old') 

С во время сна ~ 15 секунд я получаю следующий результат:

'a' timestamp: 1436901394.9 
new 'a' timestamp: 1436901409.9 

Но с время сна < = ~ 10 секунд один получает это:

'a' timestamp: 1436901247.32 
new 'a' timestamp: 1436901247.32 

Оба файла .. ., созданные за 10 секунд, имеют время, созданное-timestamp!

1

Похоже, что это по дизайну, возможно, чтобы попытаться сохранить время для «атомной экономии». Если приложение делает что-то вроде (сохранить в temp, удалять оригинал, переименовать temp в оригинал), чтобы устранить риск искаженного файла, каждый раз, когда вы сохранили файл, время создания увеличится. Файл, который вы редактировали в течение многих лет, как представляется, был создан сегодня. Такая модель сохранения очень распространена.

https://msdn.microsoft.com/en-us/library/windows/desktop/ms724320(v=vs.85).aspx Если вы переименовали или удалили файл, а затем восстановите его вскоре после этого, Windows выполнит поиск в кэше для восстановления информации о файлах. Кэшированная информация включает в себя краткую/длинную пару имен и время создания. Обратите внимание, что время модификации не восстанавливается. Поэтому после сохранения файл, похоже, был изменен, и время создания такое же, как и раньше.

Если вы создадите «новое» и переименуете его обратно в «a», вы получите старое время создания «a». Если вы удалите «a» и заново создадите «a», вы получите старое время создания «a».

0

Это поведение называется «Файловое туннелирование». Файловое туннелирование позволяет «... включать совместимость с программами, которые полагаются на файловые системы, которые могут хранить метаданные файла в течение короткого периода времени». В принципе, обратная совместимость для старых систем Windows, использующих функцию «безопасного сохранения», которая включала сохранение копии нового файла во временном файле, удаление оригинала, а затем переименование временного файла в исходный файл.

Пожалуйста, обратитесь к следующей статье базы знаний: https://support.microsoft.com/en-us/kb/172190

В качестве тестового примера, создать FiLea, переименовывать FiLea в FILEB, Создать FiLea снова (в течение 15 секунд) и дата создания будет таким же, как FILEB.

Это поведение может быть отключено в реестре в соответствии с приведенной выше статьей KB. Такое поведение также вызывает раздражение при «криминализации» машин Windows.

С уважением

Adam B