none
Win32 AP FindFirstFileW: file attribute information может не записаться в структуру "WIN32_FIND_DATA". RRS feed

  • Вопрос

  • Добрый день. В офиц. справке по win32 api-функции "FindFirstFileW" написано:

    Note  In rare cases or on a heavily loaded system, file attribute information on NTFS file systems may not be current at the time this function is called. To be assured of getting the current NTFS file system file attributes, call the GetFileInformationByHandle function.

    И что мне делать? Какое-нибудь пояснение есть к этому Note?

    Получается мне нужно полностью отказаться от использования структуры "WIN32_FIND_DATA" в функции "FindFirstFileW", т.к. может быть непредсказуемая ситуация. И нужно использовать всегда "GetFileInformationByHandle"?

    Написано так, как будто Win32 API функции сделаны не человеком, а природой, и человек не может предсказать поведение функции, так же как не может предсказать поведение погоды.

    14 июля 2019 г. 8:02

Ответы

  • В NTFS атрибуты файлов хранятся в двух местах: в записи самого файла и в записи каталога, в котором он хранится - там они продублированы, чтобы можно было быстро вытащить атрибуты всех файлов для каталога. Атрибуты в записи файла обновляются сразу, а в записи каталога - с некоторой задержкой. FindFirstFile берет данные именно с записи каталога, поэтому возвращаемые ей атрибуты могут быть устаревшими, если они недавно менялись для файла. Подробнее можно почитать здесь: https://devblogs.microsoft.com/oldnewthing/?p=8813

    "Написано так, как будто Win32 API функции сделаны не человеком, а природой, и человек не может предсказать поведение функции, так же как не может предсказать поведение погоды."

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

    Если у вас есть предложения, как улучшить формулировку в документации, вы можете открыть issue здесь: https://github.com/MicrosoftDocs/feedback/issues
    • Изменено VadimTagil 14 июля 2019 г. 15:46
    • Помечено в качестве ответа MSDN Member 14 июля 2019 г. 16:33
    14 июля 2019 г. 15:39
  • Да, конкретно этот атрибут никогда не меняется, и его значение всегда актуально в результатах FindFirstFileW.
    • Помечено в качестве ответа MSDN Member 14 июля 2019 г. 16:33
    14 июля 2019 г. 16:31

Все ответы

  • В NTFS атрибуты файлов хранятся в двух местах: в записи самого файла и в записи каталога, в котором он хранится - там они продублированы, чтобы можно было быстро вытащить атрибуты всех файлов для каталога. Атрибуты в записи файла обновляются сразу, а в записи каталога - с некоторой задержкой. FindFirstFile берет данные именно с записи каталога, поэтому возвращаемые ей атрибуты могут быть устаревшими, если они недавно менялись для файла. Подробнее можно почитать здесь: https://devblogs.microsoft.com/oldnewthing/?p=8813

    "Написано так, как будто Win32 API функции сделаны не человеком, а природой, и человек не может предсказать поведение функции, так же как не может предсказать поведение погоды."

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

    Если у вас есть предложения, как улучшить формулировку в документации, вы можете открыть issue здесь: https://github.com/MicrosoftDocs/feedback/issues
    • Изменено VadimTagil 14 июля 2019 г. 15:46
    • Помечено в качестве ответа MSDN Member 14 июля 2019 г. 16:33
    14 июля 2019 г. 15:39
  • VadimTagil, для моей задачи мне нужна только одна характеристика: является объект папкой или файлом.

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

    Так?

    Папка же не может стать файлом и наоборот: файл не может же стать папкой?



    • Изменено MSDN Member 14 июля 2019 г. 16:39
    14 июля 2019 г. 16:11
  • Да, конкретно этот атрибут никогда не меняется, и его значение всегда актуально в результатах FindFirstFileW.
    • Помечено в качестве ответа MSDN Member 14 июля 2019 г. 16:33
    14 июля 2019 г. 16:31