我需要获取名称适合某种模式的手持设备上的所有文件列表,例如“ ABC .XML”
我改编了here的代码(Hernaldo的回答),如下:
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()循环中),我都传递相同的旧第一个arg。是否有可能(在Compact Framework中)做这样的事情:
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);
}
}
JA?
这与我在下面对Alan的评论的第二次回应相吻合:
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);
}
}
答案 0 :(得分: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);
}
在这种情况下,启动递归的方法具有略微不同的签名。你也可以这样做。
答案 1 :(得分:1)
Directory.GetFiles有一个重载,需要使用搜索模式:
Directory.GetFiles(dirName, "ABC.XML")
您还可以使用"*.XML"
之类的通配符来返回所有XML文件。