Поддержка файловой системы для FindFirstFileEx, ограничьте каталогами

Я использую Windows API function FindFirstFileEx, потому что он обеспечивает возможность возвратить просто подкаталоги данного каталога (игнорирующий файлы). Однако, когда я вызываю эту функцию с необходимым флагом, я все еще получаю и файлы и каталоги.

В документации MSDN для флага FindExSearchLimitToDirectories, используемого FindFirstFileEx, говорится:

Это - консультативный флаг. Если фильтрация каталога поддержки файловой системы, функция ищет файл, который соответствует указанному имени и является также каталогом. Если файловая система не поддерживает фильтрацию каталога, этот флаг тихо проигнорирован.

lpSearchFilter параметр функции FindFirstFileEx должен быть ПУСТЫМ, когда это поисковое значение используется.

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

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

Моей системой разработки является Windows XP SP3, NTFS.NET 3.5.

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

Конечно, существует все еще шанс, я могу делать что-то неправильно в моем коде. Единственная вещь, которую я вижу, передает IntPtr. Нуль к lpSearchFilter не может совпасть с передающим ПУСТЫМ УКАЗАТЕЛЕМ (как упомянуто в кавычке).

Вот пример кода, который я использую:

    m_searchDirHandle = WinAPI.FindFirstFileEx(@"C:\Temp\*",
       WinAPI.FINDEX_INFO_LEVELS.FindExInfoStandard , 
       ref m_findDirData, WinAPI.FINDEX_SEARCH_OPS.FindExSearchLimitToDirectories,
       IntPtr.Zero , 0);

    if (m_searchDirHandle != WinAPI.INVALID_HANDLE_VALUE)
    {
        do
        {
            foundNextDir = WinAPI.FindNextFile(m_searchDirHandle, ref m_findDirData);

        } while (foundNextDir);
    }

9
задан Ash 13 February 2010 в 02:54
поделиться

1 ответ

Ближайшая ссылка, которую я смог найти, это список системных вызовов Metasploit ... Я делаю здесь удар, но я могу предположить, что этот 'FindFirstFileEx' каким-то образом будет косвенным вызовом Эквивалент системного вызова NT 'NtOpenDirectoryObject', 'NtQueryDirectoryFile', 'NtQueryDirectoryObject' ... Надеюсь ... если кто-то думает, что я ошибаюсь и не согласен, я буду исправлен тем, кто не согласен :)

Однако я здесь есть несколько ссылок.

  • Форум CodeGuru по этому вопросу о флаге
  • Wine имеет почтовую рассылку, помеченную как флаг как неэффективный?
  • GenNT упоминает, что это очевидно, ограничено NTFS (есть 3 ответа на это сообщение)
  • Здесь, на SO , вопрос о «Как получить список папок в этой папке»

Изменить: Только что после упоминания в комментариях, я подумал, что было бы достаточно добавить ссылку на драйвер Linux NTFS для возможности чтения раздела NTFS, есть bo и быть изменениями исходной версии для различных версий NTFS, начиная с Win2000 ...

Надеюсь, это поможет, С уважением, Том.

4
ответ дан 3 November 2019 в 07:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: