我有以下文件夹结构:
每个客户文件夹下都有项目文件夹(从 1 个项目文件夹到 10+ 个文件夹不等)。每个项目文件夹都以随机生成的 5 位数字和名称命名。
目标是让用户使用搜索框并输入部分客户名称或项目 ID 号(5 位数字值),并让应用搜索并生成与此信息匹配的文件夹名称列表我可以在列表框中显示。我的问题是每个项目文件夹下可能有几十个子文件夹/文件,其中包含客户名称或文件夹名称中的 5 位 ID。我不希望列表框显示比项目级别更深的任何子文件夹。
是否有一种干净的方法来搜索与父目录级别和下一级输入匹配的所有文件夹名称?
答案 0 :(得分:0)
好吧,我建议在 Linq 的帮助下查询文件系统,例如
using System.IO;
using System.Linq;
...
string root = @"C:\MasterFolfer";
// User Name must contain "user1" substring
string myUserFilter = "user1";
// Project Folder must contain "123" substring
string myProjectFilter = "123";
var projectFolders = Directory
.EnumerateDirectories(root)
.Where(dir => new DirectoryInfo(dir).Name.Contains(myUserFilter))
.SelectMany(userDir => Directory.EnumerateDirectories(userDir))
.Select(dir => new DirectoryInfo(dir).Name.Contains(myProjectFilter))
.ToArray();
答案 1 :(得分:0)
我打算建议使用 DirectoryInfo.GetDirectories
并将 SearchOption
Enum
设置为 1,但由于您只想查看子目录的第一级,所以这是行不通的。你可以像这样滚动你自己的方法:
public List<string> GetMatchingDirectories(string parentDir, string matchPhrase)
{
List<string> dirs = new List<string>();
//get parent directory with parameter of method
DirectoryInfo di = new DirectoryInfo(parentDir);
//get directories that match in the parent directory
DirectoryInfo[] directories =
di.GetDirectories("*" + matchPhrase + "*", SearchOption.TopDirectoryOnly);
//iterate the parent directory matching directories and add to list
foreach(DirectoryInfo dinfo in directories)
{
dirs.Add(dinfo.Name);
//get the 1st sublevel only of matching directories of current parent dir
//and add to list
foreach(DirectoryInfo cinfo in dinfo.GetDirectories("*" + matchPhrase + "*", SearchOption.TopDirectoryOnly))
{
dirs.Add(cinfo.Name);
}
}
return dirs;
}