小编典典

尽管有匹配项,为什么此函数什么也不返回?

algorithm

我称之为(紧凑框架-此代码在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());

…但是,即使有一个与fileType匹配并具有.xml扩展名的文件,它也不返回任何内容(MessageBox显示“ 0”)。

是因为我的GetXMLFiles()方法出问题了吗?据这里的一只猫说,我的方法搞砸了,我应该更经常地将其添加到通用字符串列表(文件名)中。

如果他是正确的,那么我不会理解,因为在我看来这就是方法的工作方式:

(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循环运行其课程/处理所有目录之后,控制权移至代码的最后一行,该代码将fileNames返回给调用方。

因此,根据我的看法,我应该把比赛归还,但我什么也没得到。

如果我错了,而Alan是正确的,那么我应该在哪里添加添加的附加调用/如何重新构造此方法?

更新

像这样调用它:

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

…不起作用,但是这种方式可以做到:

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

阅读 309

收藏
2020-07-28

共1个答案

小编典典

在递归中,您将丢失在子目录中找到的文件。通过以下方式捕获返回文件名:

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

发生的情况是此行var fileNames = new List<String>();创建了一个名为的局部变量fileNames。您可能会认为,因为您的方法是静态的,所以方法内部的变量是静态的。不是这种情况。因此,每次调用时GetXMLFiles,都会为每个调用创建此变量的副本。

由于fileNames对于的每次调用都是本地的GetXMLFiles,因此您需要将其找到的所有文件名返回给调用者,并且调用者需要将这些文件名添加到其本地的集合中。

2020-07-28