【发布时间】:2014-03-08 02:40:25
【问题描述】:
我正在调用这个(Compact Framework - 此代码在 Windows CE 手持设备上运行)方法:
public static List<string> GetXMLFiles(string fileType, string startingDir)
{
const string EXTENSION = ".XML";
string dirName = startingDir;
var fileNames = new List<String>();
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<String> XMLFiles = CCRUtils.GetXMLFiles(fileType, "\\");
MessageBox.Show(XMLFiles.Count.ToString());
...但它什么也没返回(MessageBox 显示“0”),即使有一个文件与 fileType 匹配并且具有 .xml 扩展名。
是不是因为我的 GetXMLFiles() 方法有问题?根据一只猫here,我的方法被搞砸了,我应该更频繁地添加到字符串(文件名)的通用列表中。
如果他是对的,但我不明白,因为在我看来,这就是该方法的工作方式:
(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.
通过这种方式,搜索所有目录,并将找到的任何匹配项添加到字符串(文件名)的通用列表中。
在第二个 foreach 循环运行其课程/处理所有目录后,控制权落到最后一行代码,它将文件名返回给调用者。
所以,根据我的理解,我应该得到匹配,但我什么也没得到。
如果我错了而 Alan 是对的,我应该在哪里添加对 add 的额外调用/应该如何重做这个方法?
更新
这样称呼它:
List<String> XMLFiles = CCRUtils.GetXMLFiles(fileType, "\\");
...不起作用,但这样可以:
List<String> XMLFiles = CCRUtils.GetXMLFiles(fileType, @"\");
【问题讨论】:
标签: c# algorithm recursion foreach compact-framework