GetFileInformationByHandleEx / FileIdInfo против DeviceIoControl / FSCTL_CREATE_OR_GET_OBJECT_ID для OpenFileById - PullRequest
0 голосов
/ 18 июня 2020

Недавно я наткнулся на статью Рэймонда Чена « Если вы хотите использовать GUID для идентификации файлов, тогда никто не остановит вас », и мне захотелось реализовать этот метод. Но затем я обнаружил, что есть другой способ получить идентификатор файла, и это GetFileInformationByHandleEx с FILE_INFO_BY_HANDLE_CLASS::FileIdInfo и с использованием поля FileId (128 бит).

Я пробовал оба, оба метода работают, как ожидалось но у меня есть несколько вопросов, на которые я не могу найти ответов:

  • Эти методы возвращают разные идентификаторы (и идентификатор из GetFileInformationByHandleEx, похоже, использует только младшие 64 бита, оставляя высокую часть равной нулю) . Что каждый из них представляет? По сути, это одно и то же или просто два независимых механизма для достижения одной и той же цели?
    • Редактировать: На самом деле я только что нашел некоторую информацию . Итак, ObjectID из DeviceIoControl - это идентификатор объекта NTFS, но каков другой идентификатор? Как они связаны (если вообще связаны)? Оба метода доступны только в NTFS или хотя бы один из них будет работать с FAT16 / 32, exFAT, et c?
  • Документация для FILE_INFO_BY_HANDLE_CLASS::FileIdInfo не сообщает нам, что идентификатор может не существовать, в отличие от FSCTL_CREATE_OR_GET_OBJECT_ID, где мне нужно явно указать, что я хочу, чтобы идентификатор был создан, если его еще нет. Будет ли это иметь плохие последствия, если я просто вслепую запрошу создание идентификаторов объектов для любого файла, с которым буду работать?
  • Я нашел комментарий к этому вопросу , эти идентификаторы остаются неизменными, если файл перемещается на другой том (логический или физический). Я тестировал только метод DeviceIoControl, но они действительно не меняются между дисками, но если я переместу файл, мне нужно предоставить OpenFileById дескриптор тома назначения, иначе он не откроет файл. Итак, есть ли способ заставить OpenFileById найти файл без сохранения ссылки на том?
    • Я думаю о перечислении всех подключенных томов, чтобы попытаться открыть файл по идентификатору для каждый, пока не получится, но я не уверен, насколько это надежно. Может ли существовать два одинаковых идентификатора, которые ссылаются на разные файлы на разных томах?
  • Насколько быстро система запрашивает (или создает) идентификатор? Будет ли ухудшаться производительность, если я добавлю запрос идентификатора к обычным процедурам перечисления файлов, или мне лучше делать это только по запросу, когда мне это действительно нужно?
...