Поддержка файловой системы FindFirstFileEx, ограничение по каталогам - PullRequest
9 голосов
/ 12 февраля 2010

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

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

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

Параметр lpSearchFilter Функция FindFirstFileEx должна быть NULL когда используется это значение поиска.

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

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

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

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

Конечно, все еще есть вероятность, что я что-то неправильно делаю в своем коде. Единственное, что я вижу, это то, что передача IntPtr.Zero в lpSearchFilter может не совпадать с передачей NULL (как указано в цитате).

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

    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);
    }

1 Ответ

4 голосов
/ 12 февраля 2010

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

Тем не менее, я нажал на несколько ссылок здесь

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...