Доступны ли дополнительные параметры для 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.