Доступны ли дополнительные параметры для Compact Framework?

Мне нужно получить список всех файлов на портативном устройстве, имена которых соответствуют определенному шаблону, например, "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()), я передаю один и тот же старый первый аргумент. Возможно ли (в Compact Framework) сделать что-то вроде этого вместо этого:

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

?

ОБНОВИТЬ

По словам Хабиба, это должно сработать (новый раздел "попробовать"):

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);
    }
}

Ja?

ОБНОВЛЕНИЕ 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);
    }
}

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);
}

В этом случае метод, который запускает рекурсию, имеет немного другую сигнатуру. Вы могли бы сделать то же самое.

Directory.GetFiles имеет перегрузку, которая принимает шаблон поиска, который вы можете использовать:

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

Вы также можете использовать подстановочные знаки, такие как "*.XML" который вернул бы все файлы XML.

Другие вопросы по тегам