为什么这个函数什么都没有返回,虽然有匹配?
我称之为(Compact Framework – 此代码在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; }
……像这样:
List XMLFiles = CCRUtils.GetXMLFiles(fileType, "\\"); MessageBox.Show(XMLFiles.Count.ToString());
…但它没有返回任何内容(MessageBox显示“0”),即使文件与fileType匹配且扩展名为.xml。
是因为我的GetXMLFiles()方法有问题吗? 根据这里的一只猫,我的方法被搞砸了,我应该更频繁地添加到字符串(fileNames)的通用列表中。
如果他是对的,我不会那样做,因为在我看来这就是方法应该如何工作:
(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.
通过这种方式,搜索所有目录,并将找到的任何匹配项添加到字符串(fileNames)的通用列表中。
在第二个foreach循环运行其路线/处理所有目录之后,控制将下降到最后一行代码,这会将fileNames返回给调用者。
所以,根据我对它的了解,我应该把比赛归还,但我什么都没得到。
如果我错了并且Alan是对的,那么我应该在哪里添加额外的调用来添加/如何重新设计此方法?
UPDATE
这样称呼它:
List XMLFiles = CCRUtils.GetXMLFiles(fileType, "\\");
…不起作用,但这样做:
List XMLFiles = CCRUtils.GetXMLFiles(fileType, @"\");
在递归中,您丢失了在子目录中找到的文件。 以这种方式捕获返回文件名:
foreach (string d in Directory.GetDirectories(dirName)) { fileNames.AddRange(GetXMLFiles(fileType, d)); }
发生了什么是这行var fileNames = new List
创建一个名为fileNames
的局部变量。 您可能会认为因为您的方法是静态的,方法内的变量是静态的。 不是这种情况。 因此,每次调用GetXMLFiles
,都会为每个调用创建此变量的副本。
由于fileNames
对于GetXMLFiles
每次调用都是本地的,因此您需要将它找到的所有fileNames返回给调用者,并且调用者需要将这些添加到本地的集合中。