2010-02-12 2 views
9

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

@Johannes, merci, j'ai résolu la question. – Ash

+0

Vous voudrez peut-être changer le titre de la question ainsi –

+0

@John, oui fait. Note à self: OS! = FS;) – Ash

Répondre

4

Le lien le plus proche que je pouvais trouver était, la liste des appels système par Metasploit ... Je prends un coup de poignard ici mais j'imagine que 'FindFirstFileEx' serait en quelque sorte un appel indirect à l'appel système NT équivalent 'NtOpenDirectoryObject', 'NtQueryDirectoryFile', 'NtQueryDirectoryObject' ... J'espère ... si quelqu'un pense que je me trompe et que je ne suis pas d'accord, je le ferai être corrigé par celui qui n'est pas d'accord :)

Cependant, j'ai trouvé quelques liens ici

forum
  • CodeGuru sur cette question au sujet du drapeau
  • Wine a un mailing répertorié comme le drapeau comme aucun effet?
  • GenNT mentionne qu'il est apparemment limité à NTFS, (il y a 3 réponses à cette publication)
  • Ici, sur SO, une question sur « Comment obtenir la liste des dossiers dans ce dossier »

Modifier : Juste après avoir mentionné dans les commentaires, je pensais qu'il serait assez approprié d'ajouter un lien vers le Linux NTFS driver pour les capacités de lire la partition NTFS, il y a forcément des changements de version source pour accueillir les différentes versions NTFS remontant à Win2000 ...

Espérons que cela aide, Cordialement, Tom.

+0

Aussi, il est possible que cela dépende de la version de ntfs que vous utilisez. Je crois qu'il y avait quelques changements autour de la période de WinXP. –

+0

@John: Je serais enclin à accepter car il y avait des changements NTFS (à partir de Vista par rapport à la nouvelle méthode bootloader) et aussi, XP maison et professionnel avait une différence cruciale dans le NTFS - sécurité, en professionnel, vous pouvez définir les autorisations, non disponibles sous Accueil ... – t0mm13b

+0

S'il vous plaît voir ma réponse éditée ... :) – t0mm13b

Questions connexes