Perché questa funzione non restituisce nulla, anche se esiste una corrispondenza?

Sto chiamando questo (Compact Framework – questo codice viene eseguito su un dispositivo palmare Windows CE):

public static List GetXMLFiles(string fileType, string startingDir) { const string EXTENSION = ".XML"; string dirName = startingDir; var fileNames = new List(); try { foreach (string f in Directory.GetFiles(dirName)) { string ext = Path.GetExtension(f).ToUpper(); string fileNameOnly = Path.GetFileNameWithoutExtension(f); if ((ext.Equals(EXTENSION, StringComparison.OrdinalIgnoreCase)) && (fileNameOnly.Contains(fileType))) { fileNames.Add(f); } } foreach (string d in Directory.GetDirectories(dirName)) { GetXMLFiles(fileType, d); } } catch (Exception ex) { MessageBox.Show(ex.Message); } return fileNames; } 

…così:

 List XMLFiles = CCRUtils.GetXMLFiles(fileType, "\\"); MessageBox.Show(XMLFiles.Count.ToString()); 

… ma non restituisce nulla (MessageBox mostra “0”), anche se esiste un file che corrisponde a fileType e ha un’estensione .xml.

È perché c’è qualcosa di sbagliato nel mio metodo GetXMLFiles ()? Secondo un gatto qui , il mio metodo è oscurato, e dovrei aggiungere alla lista generica di string (fileNames) più spesso.

Se ha ragione, non lo capisco, però, perché mi sembra che questo dovrebbe funzionare:

 (a) The first foreach loop looks at files below the root; if a match is found, it's added to the generic list of string (b) The second foreach loop makes a recursive call to its method, once for every subdirectory on the device; step "a" occurs again for that directory, adding any matches to the generic list of string. 

In questo modo vengono cercate tutte le directory e tutte le corrispondenze trovate vengono aggiunte all’elenco generico di string (fileNames).

Dopo che il secondo ciclo foreach ha eseguito il suo corso / gestisce tutte le directory, il controllo scende alla riga finale del codice, che restituisce nomi file al chiamante.

Quindi, secondo il mio groking, dovrei ottenere il ritorno della partita, ma non otterrò assolutamente niente.

Se ho torto e Alan ha ragione, dovrei aggiungere la chiamata aggiuntiva per aggiungere / come dovrebbe essere rielaborato questo metodo?

AGGIORNARE

Chiamandolo così:

 List XMLFiles = CCRUtils.GetXMLFiles(fileType, "\\"); 

… non funziona, ma in questo modo:

 List XMLFiles = CCRUtils.GetXMLFiles(fileType, @"\"); 

    Nella tua ricorsione, stai perdendo i file che trovi nelle sottodirectory. Cattura i nomi dei file di ritorno in questo modo:

     foreach (string d in Directory.GetDirectories(dirName)) { fileNames.AddRange(GetXMLFiles(fileType, d)); } 

    Quello che sta succedendo è che questa riga var fileNames = new List(); crea una variabile locale chiamata fileNames . Potresti pensare perché il tuo metodo è statico, le variabili all’interno del metodo sono statiche. Questo non è il caso. Pertanto, ogni volta che si chiama GetXMLFiles , viene creata una copia di questa variabile per ogni chiamata.

    Poiché fileNames è locale per ogni chiamata di GetXMLFiles , è necessario restituire al chiamante tutti i nomi file che trova e il chiamante deve aggiungerli alla raccolta locale.