1

我需要获取手持设备上名称符合特定模式的所有文件的列表,例如“ ABC .XML”

我从这里改编了代码(赫纳尔多的回答),如下所示:

public static List<string> GetXMLFiles(string fileType, string dir)
{
    string dirName = dir; // call it like so: GetXMLFiles("ABC", "\\");  <= I think the double-whack is what I need for Windows CE device...am I right?
    var fileNames = new List<String>();
    try
    {
        foreach (string f in Directory.GetFiles(dirName))
        {
            if ((f.Contains(fileType)) &&  (f.Contains(".XML")))
            {
                fileNames.Add(f);
            }
        }
        foreach (string d in Directory.GetDirectories(dirName))
        {
            GetXMLFiles(fileType, d);
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
    return fileNames;
}

...但是每次该方法递归调用自身时(在 GetDirectories() 循环中),我都会传递相同的旧第一个参数。是否有可能(在紧凑框架中)做这样的事情:

public static List<string> GetXMLFiles(optional string fileType, string dir)
{
        . . .        
        foreach (string d in Directory.GetDirectories(dirName))
        {
            GetXMLFiles(dir = d);
        }
        . . .

?

更新

根据 Habib 的说法,这应该有效(新的“尝试”部分):

try
{
    string filePattern = string.Format("*{0}*.XML", fileType);
    foreach (string f in Directory.GetFiles(dirName, filePattern))
    {
        fileNames.Add(f);
    }
    foreach (string d in Directory.GetDirectories(dirName))
    {
        GetXMLFiles(fileType, d);
    }
}

贾?

更新 2

这与我对以下艾伦评论的第二次回应相一致:

const string EXTENSION = ".XML";
. . .
try
{
    foreach (string f in Directory.GetFiles(dirName))
    {
        string ext = Path.GetExtension(f);
        string fileNameOnly = Path.GetFileNameWithoutExtension(f);
        if ((ext.Equals(EXTENSION, StringComparison.Ordinal)) && (fileNameOnly.Contains(fileType)))
        {
            fileNames.Add(f);
        }
    }
    foreach (string d in Directory.GetDirectories(dirName))
    {
        GetXMLFiles(fileType, d);
    }
}
4

2 回答 2

2

可选参数是 .NET 4.0 的一项功能,因此您将无法使用它们。使用递归函数的典型解决方案是为您的方法创建两个具有不同参数的重载。

例如,

BinarySearch(array a);
{
  BinarySearch(a, -1, array.Length);
} 

BinarySearch(array, low, high)
{
   //code to update low high
   return BinarySearch(array, low, high);
}

在这种情况下,启动递归的方法具有稍微不同的签名。你也可以这样做。

于 2014-03-04T17:41:23.453 回答
1

Directory.GetFiles有一个重载,它采用搜索模式,您可以使用它:

Directory.GetFiles(dirName, "ABC.XML")

您还可以使用通配符"*.XML",例如返回所有 XML 文件。

于 2014-03-04T17:08:26.387 回答