2010-02-12 16 views
9

Sto utilizzando la funzione API di Windows FindFirstFileEx perché offre la possibilità di restituire solo le sottodirectory di una determinata directory (ignorando i file). Tuttavia quando chiamo questa funzione con la flag richiesta, ricevo comunque sia file che directory.Supporto del file system per FindFirstFileEx, limite alle directory

La documentazione MSDN per la bandiera FindExSearchLimitToDirectories usata da FindFirstFileEx dice:

Questa è una bandiera di consulenza. Se il file supporta il filtro della directory, , la funzione cerca un file che corrisponda al nome specificato ed è anche una directory. Se il file system non supporta il filtro di directory , questo flag viene ignorato in modo silenzioso.

Il parametro lpSearchFilter della funzione FindFirstFileEx deve essere NULL quando si utilizza questo valore di ricerca.

Se il filtro directory si desidera, questo flag può essere utilizzato su tutti file system, ma perché è un avviso bandiera e riguarda solo file system che lo supportano, l'applicazione deve esaminare il file attributi memorizzati dati nel parametro lpFindFileData della funzione FindFirstFileEx per determinare se la funzione ha restituito un handle a una directory.

Quindi, quali file system supportano effettivamente questo flag? Sarebbe stato sensato elencare effettivamente questi file system supportati nella stessa pagina, ma non riesco a trovarlo.

Il mio sistema di sviluppo è Windows XP SP3, NTFS, .NET 3.5.

So che posso controllare gli attributi del file per determinare se un file è una directory, tuttavia questo significa controllare ogni file/directory. In primo luogo, sconfigge anche lo scopo di utilizzare FindFirstFileEx.

Naturalmente c'è ancora la possibilità che io stia facendo qualcosa in modo non corretto nel mio codice. L'unica cosa che posso vedere è che passare IntPtr.Zero a lpSearchFilter potrebbe non essere lo stesso di passare NULL (come menzionato nella citazione).

Ecco un esempio del codice che sto utilizzando:

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, grazie, ho risolto la domanda. – Ash

+0

Puoi anche cambiare il titolo della domanda –

+0

@ John, sì fatto. Nota per self: OS! = FS;) – Ash

risposta

4

Il collegamento più vicino ho trovato è stato, l'elenco delle chiamate di sistema da Metasploit ... mi prendo una pugnalata qui ma immagino che questo 'FindFirstFileEx' sarebbe in qualche modo una chiamata indiretta all'equivalente di chiamata del sistema NT 'NtOpenDirectoryObject', 'NtQueryDirectoryFile', 'NtQueryDirectoryObject' ... Spero ... se qualcuno pensa che io sia sbagliato e che i downvotes non siano d'accordo, lo farò essere corretto da chiunque non sia d'accordo :)

Tuttavia, ho trovato alcuni link qui

  • CodeGuru forum su questo tema sulla bandiera
  • Wine ha una mailing elencato come la bandiera di nessun effetto?
  • GenNT menzioni che è apparentemente limitato a NTFS, (c'è 3 risposte a quello di invio)
  • Qui su SO, una domanda su 'Come ottenere l'elenco delle cartelle in questa cartella'

Edit : Proprio ora dopo aver menzionato nei commenti, ho pensato che sarebbe stato abbastanza appropriato aggiungere un collegamento allo Linux NTFS driver per le capacità di leggere la partizione NTFS, ci sono delle modifiche alla versione sorgente per soddisfare le diverse versioni NTFS che tornano a Win2000 ...

Spero che questo aiuti, Cordiali saluti, Tom.

+0

Inoltre, è possibile che ciò dipenda dalla versione di _nft che si sta utilizzando. Credo che ci siano stati alcuni cambiamenti attorno al tempo di WinXP. –

+0

@John: Sarei incline a concordare poiché c'erano modifiche NTFS (da Vista in poi in relazione al nuovo metodo di bootloader) e inoltre, XP home e professional avevano una differenza fondamentale nel NTFS: la sicurezza, in ambito professionale, si poteva impostare le autorizzazioni, non disponibili in Home ... – t0mm13b

+0

Vedere la risposta modificata ... :) – t0mm13b

Problemi correlati