Почему Windows присваивает новым файлам старую дату создания через Tunneling
Почему Windows присваивает новым файлам старую дату создания через Tunneling

Допустим, есть файл articles.txt, созданный вчера. Его удаляют. Через несколько секунд в той же папке создают совсем другой файл с именем article.txt. И вот странность: в свойствах Windows сообщает, что новый файл создан вчера.

Как и многое в Windows, этой особенности уже десятки лет, и это не баг. У неё даже есть запоминающееся название: tunnelling.

Сам механизм называется File System Tunnelling. Это особенность NTFS и FAT: если удалить или переименовать файл, а затем быстро создать в той же папке другой файл с тем же именем, новый файл унаследует метаданные, например время создания исходного файла или сопоставление короткого и длинного имени.

Но зачем Windows сознательно выдаёт новый файл за старый? Мы изучили официальную документацию, чтобы найти ответ.

Windows недолго помнит удалённый файл

В документации Microsoft по FileSystemInfo.CreationTime сказано: “Диски, отформатированные в NTFS, могут на короткое время кэшировать метаинформацию о файлах, например время создания. Этот процесс называется file tunneling”.

Инженер Microsoft Рэймонд Чен писал об этом в 2005 году и провёл забавную аналогию с квантовым туннелированием, откуда и взялось название.

В квантовой механике туннелированием называют ситуацию, когда частица оказывается по другую сторону энергетического барьера, хотя энергии на его преодоление у неё нет.

Чен пошутил, что метаданные файлов в Windows проделывают тот же трюк: исчезают с одной стороны и появляются с другой.

“В случае с file system tunneling речь идёт об информации, которая как будто нарушает законы классической механики. Информация была уничтожена (при удалении или переименовании файла), но каким-то образом восстановилась по другую сторону временного барьера.”

Он также отметил, что разработчик Windows 95, создавший этот механизм, увлёкся аналогией и назвал внутренние структуры данных кварками.

Как работает File System Tunnelling

  • Когда файл удаляют или переименовывают, Windows создаёт запись в tunnel cache.

  • Если в течение короткого промежутка времени в том же каталоге создать файл с тем же именем, Windows применит к нему кэшированные метаданные (время создания, сопоставление SFN/LFN).

  • Кэш существует отдельно для каждого тома и автоматически очищает старые записи при заполнении.

Опасений насчёт приватности и безопасности здесь нет: удалённый файл исчезает, и его содержимое не возвращается. Windows сохраняет на 15 секунд только метаданные, а именно время создания и связь между длинным именем файла и коротким именем в формате 8.3.

К тому же кэш не вечен. Он привязан к каталогу, существует временно и срабатывает только тогда, когда нужные операции create или rename происходят внутри его окна. Новый файл не унаследует старую метку времени только потому, что его имя совпало с чем-то удалённым месяц назад.

Для тех, кто беспокоится о восстановлении удалённых файлов после сброса Windows, в Cloud Rebuild появилась новая опция Data Sanitization.

Как бы то ни было, главный вопрос в другом: зачем file system tunnelling вообще нужен?

Microsoft создала туннелирование не для того, чтобы запутать пользователей

Когда документ, созданный вчера, правят в Word и сохраняют, ожидается, что файл сохранит исходную дату создания: его редактировали, а не создавали заново.

Однако, как отмечает Чен, “внутри многие программы сохраняют файл через комбинацию операций save, delete и rename”.

То есть многие приложения не изменяют существующий файл на месте. Программа может создать временный файл с обновлённым содержимым, удалить оригинал, а затем переименовать временный файл в исходное имя. Такой подход называют safe save.

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

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

Причина не единственная. Другой пример Чена касается старых программ, которые понимали только короткие имена в формате 8.3. Если такая программа заменяла “File with long name.txt”, не сохраняя связь длинного и короткого имени, файл мог полностью потерять понятное имя и остаться с коротким именем из эпохи DOS.

В 16-битных приложениях доступны только короткие имена файлов (SFN). Туннелирование сохраняет связь между SFN и LFN (длинными именами), когда файлы переименовывают или создают заново.

По сути, file system tunneling нужен, чтобы поддерживать схему safe save, которую используют приложения, и сохранять совместимость коротких имён 8.3 с длинными.

Какие пары операций приводят к туннелированию имени файла

В документации Microsoft по FltGetTunneledName механизм описан как tunnel cache для каждого тома. Там перечислены пары операций, которые запускают туннелирование.

  • delete(name) / create(name)

  • delete(name) / rename(source, name)

  • rename(name, newname) / create(name)

  • rename(name, newname) / rename(source, name)

Кому интересно, в старой статье базы знаний Microsoft, написанной для Windows NT и XP, рассказано, как через реестр изменить или отключить 15-секундное окно кэша туннелирования.

Так что если новый файл вдруг сообщает, что ему несколько дней, Windows, скорее всего, не сломана. Она просто ведёт себя так, как задумано в Microsoft.