Я использую функцию 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);
}