我试图将文件名匹配到List中的部分字符串。该列表中将包含192个匹配文件,匹配文件为xxx192.dat。使用.Contains将文件名与List中的字符串不匹配。谁能告诉我如何完成这项工作或如何在包含中使用通配符? 代码如下。
// use this to get a specific list of files
private List<string> getFiles(string path, List<string> filenames)
{
List<string> temp = new List<string>();
string mapPath = Server.MapPath(path);
//DirectoryInfo Di = new DirectoryInfo(mapPath);
DirectoryInfo Di = new DirectoryInfo(@"C:\inetpub\wwwroot\Distribution\" + path); // for testing locally
FileInfo[] Fi = Di.GetFiles();
foreach (FileInfo f in Fi)
{
if (filenames.Contains(f.Name)) **// *** this never matches**
temp.Add(f.FullName);
}
return temp;
}
我改变了尝试使用建议的代码,但它仍然无效。我将添加数据,例如我踩过代码。
// use this to get a specific list of files
private List<string> getFiles(string path, List<string> filenames)
{
List<string> temp = new List<string>();
string mapPath = Server.MapPath(path);
//DirectoryInfo Di = new DirectoryInfo(mapPath);
DirectoryInfo Di = new DirectoryInfo(@"C:\inetpub\wwwroot\Distribution\" + path); // for testing locally
foreach (string s in filenames) // list has 228,91,151,184 in it
{
FileInfo[] Fi = Di.GetFiles(s); // s = 228: Fi = {System.IO.FileInfo[0]}
foreach (FileInfo f in Fi) //Fi = {System.IO.FileInfo[0]}
{
temp.Add(f.FullName);
}
}
return temp;
}
当我查看这些文件所在的目录时,我可以看到:
pbset228.dat
pbmrc228.dat
pbput228.dat
pbext228.dat
pbget228.dat
pbmsg228.dat
现在正在运作。它可能不是最有效的方法,但它完成了工作。也许有人可以发布一个更好地做同样事情的样本。
// use this to get a specific list of files
private List<string> getFiles(string path, List<string> filenames)
{
List<string> temp = new List<string>();
string mapPath = Server.MapPath(path);
//DirectoryInfo Di = new DirectoryInfo(mapPath);
DirectoryInfo Di = new DirectoryInfo(@"C:\inetpub\wwwroot\Distribution\" + path); // for testing locally
FileInfo[] Fi = Di.GetFiles();
foreach (FileInfo f in Fi)
{
foreach (string s in filenames)
{
if (f.Name.Contains(s))
temp.Add(f.FullName);
}
}
return temp;
}
答案 0 :(得分:7)
您可以使用Any()
LINQ扩展名:
filenames.Any(s => s.EndsWith(f.Name));
如果给定函数中枚举中的任何元素返回true,则返回True
。
对于任何更复杂的事情,您可以使用正则表达式来匹配:
filenames.Any(s => Regex.IsMatch(s, "pattern"));
答案 1 :(得分:6)
使用静态Directory.GetFiles方法,该方法允许您包含通配符,并且检索所有文件然后必须遍历它们会更有效。
或者你甚至可以使用DirectoryInfo.GetFiles并将搜索字符串传递给它。
答案 2 :(得分:0)
更改此
foreach (FileInfo f in Fi)
{
if (filenames.Contains(f.Name)) **// *** this never matches**
temp.Add(f.FullName);
}
return temp;
进入类似的事情
temp = filenames.Find(file => file.Contains(someNameYoureLookingFor));