J'utilise la fonction API Windows FindFirstFileEx car elle permet de renvoyer uniquement les sous-répertoires d'un répertoire donné (en ignorant les fichiers). Cependant, lorsque j'appelle cette fonction avec le drapeau requis, je reçois toujours les fichiers et les répertoires.Prise en charge du système de fichiers pour FindFirstFileEx, limite aux répertoires
La documentation MSDN pour le drapeau FindExSearchLimitToDirectories utilisé par FindFirstFileEx dit:
C'est un drapeau consultatif. Si le système prend en charge le filtrage d'annuaire, la fonction recherche un fichier correspondant au nom spécifié et un répertoire. Si le système de fichiers ne prend pas en charge le filtrage de répertoire, l'indicateur est ignoré silencieusement. Le paramètre lpSearchFilter de la fonction FindFirstFileEx doit être NULL lorsque cette valeur de recherche est utilisée.
Si le filtrage de répertoire est souhaité, ce drapeau peut être utilisé sur tous les fichiers systèmes, mais parce qu'il est un drapeau consultatif et ne concerne que les systèmes de fichiers qui prennent en charge, l'application doit examiner le fichier des données d'attribut stockées dans le paramètre lpFindFileData de la fonction FindFirstFileEx pour déterminer si la fonction a renvoyé un handle à un répertoire.
Alors, quels systèmes de fichiers supportent réellement ce drapeau? Il aurait été judicieux de répertorier ces systèmes de fichiers pris en charge sur la même page, mais je ne le trouve pas.
Mon système de développement est Windows XP SP3, NTFS, .NET 3.5.
Je sais que je peux vérifier les attributs de fichier pour déterminer si un fichier est un répertoire, mais cela signifie vérifier chaque fichier/répertoire. Cela va également à l'encontre de l'objectif d'utiliser FindFirstFileEx en premier lieu.
Bien sûr, il est possible que je fasse quelque chose de mal dans mon code. La seule chose que je peux voir est de passer IntPtr.Zero à lpSearchFilter peut ne pas être le même que de passer NULL (comme mentionné dans la citation).
Voici un exemple du code que je utilise:
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);
}
@Johannes, merci, j'ai résolu la question. – Ash
Vous voudrez peut-être changer le titre de la question ainsi –
@John, oui fait. Note à self: OS! = FS;) – Ash