Являются ли API FindFirstFile, FindNextFile ненадежными?

В своих целях я искал способы рекурсивного перечисления подпапок из заданной папки в файловой системе NTFS в Windows, и я наткнулся на это немного «драгоценный камень«со страницы Microsoft для FindFirstFile API:

Заметка В редких случаях или в сильно загруженной системе атрибут файла
информация о файловых системах NTFS может быть неактуальной на момент
функция называется. Чтобы быть уверенным в получении текущего файла NTFS
системные атрибуты файлов, вызовите GetFileInformationByHandle функция.

Итак, позвольте мне попытаться понять это.

Я полагаюсь на dwFileAttributes параметр, возвращаемый в WIN32_FIND_DATA структура, чтобы сказать файл из папки. Так что эта заметка говорит о том, что в некоторых случаях я могу получить какой-то поддельный результат, верно? Если так, то почему бы не исправить это в одном из своих обновлений вместо того, чтобы публиковать его здесь?

А также их предложенный обходной путь использования API GetFileInformationByHandle. Как именно я должен это назвать? Требуется дескриптор файла. Так они действительно хотят, чтобы мы открывали каждый файл, который FindNextFile возвращается и звонит GetFileInformationByHandle в теме? Можете ли вы представить себе, «как далеко» будет идти моя оптимизация при таком подходе?

Во всяком случае, было бы хорошо, если бы кто-то мог пролить свет на это …

0

Решение

Различение файла из папки будет в порядке, потому что эта информация, вероятно, будет постоянной. Файлы не превращаются в папки или папки в файлы.

Документация говорит, что «может быть не актуально», потому что другие процессы могут изменять атрибуты, и без механизма блокировки для синхронизации атрибутов пишутся лениво. Если вашему приложению требуется абсолютно актуальная информация, вы извлекаете ее … ByHandle, которая обеспечивает актуальность информации.

4

Другие решения

Именно так работает каждая функция отчетности о состоянии. В лучшем случае он сообщает о состоянии в некоторой неопределенной точке между моментом, когда вы вызывали функцию и когда функция возвращалась. Но это не «замораживает мир», чтобы гарантировать, что данные все еще действительны позже.

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

Если вы откроете файл и получите дескриптор к нему, вы уверены, что все ваши операции, использующие этот дескриптор, будут к одному и тому же базовому файлу. Но когда вы выполняете операции по имени, такой гарантии нет. Файлы могут быть созданы, удалены и переименованы. Таким образом, одно и то же имя не может позже ссылаться на тот же файл.

2

dwFileAttributes не является чем-то ненадежным, когда речь идет о разнице между файлами и папками. Я думаю, что это примечание относится к информации, которая может кэшироваться для обновления файловой системой (измененные / доступные метки времени и т. Д.), Но независимо от того, является ли элемент файлом или папкой, что-то не изменится.

1
По вопросам рекламы [email protected]