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);
}
@Johannes, grazie, ho risolto la domanda. – Ash
Puoi anche cambiare il titolo della domanda –
@ John, sì fatto. Nota per self: OS! = FS;) – Ash