我在C#程序中遇到了一个奇怪的问题。 我有一些本地文件夹路径,如
"C:\test\AB_Systems\ELEGANCE\CB-DOC\live\M7-091.249.99.XX.01\extobjects".
现在我想在名为" extobjects"的子文件夹中搜索PDF文件。 不幸的是,文件夹" live"中有很多子文件夹,它有一个名为" extobjects"的子文件夹,所以我认为在搜索路径中使用通配符会更好:
"C:\test\AB_Systems\ELEGANCE\CB-DOC\live\*\extobjects"
但这不起作用。 有没有办法做到这一点?
答案 0 :(得分:1)
public static FileInfo[] findFile(String whereToSearch, String searchFor , String mode)
{
IEnumerable<FileInfo> files = null;
if (mode.Equals(""))
mode = "s";
if (searchFor.Equals(""))
searchFor = "*";
if (mode.Equals("r") || mode.Equals("recursive"))
{
DirectoryInfo dir = new DirectoryInfo(whereToSearch);
files = dir.EnumerateFiles(searchFor, searchOption: SearchOption.AllDirectories);
}
if (mode.Equals("s") || mode.Equals("specific"))
{
DirectoryInfo dir = new DirectoryInfo(whereToSearch);
files = dir.EnumerateFiles(searchFor, searchOption: SearchOption.TopDirectoryOnly);
}
if (files != null) return files.ToArray<FileInfo>();
else return null;
}
这是一个如何做的例子。
重要的是,只有文件名可以包含像*这样的通配符模式。路径可以作为开始搜索的位置,并通过提供 searchOption:searchOption.AllDirectories 作为参数,它将遍历条目路径的所有子目录。
您将收到一个FileInfo数组,其中包含路径和更多信息的对象。
答案 1 :(得分:0)
您可以像这样使用Linq:
var files = Directory
.EnumerateDirectories(@"C:\test\AB_Systems\ELEGANCE\CB-DOC\live", "extobjects", SearchOption.AllDirectories)
.SelectMany(x => Directory.EnumerateFiles(x, "*pdf", SearchOption.TopDirectoryOnly))
.ToArray();
答案 2 :(得分:0)
我选择的解决方案正是BugFinder所提出的,如果您的.NET目标支持,您可以将以下foreach-loop优化为LINQ查询。
// Itterate subdirectories of the live folder
foreach (var subDir in Directory.GetDirectories(@"C:\test\AB_Systems\ELEGANCE\CB-DOC\live"))
{
// Check if path to extobjects exists
var extObjects = Path.Combine(subDir, "extobjects");
if (Directory.Exists(extObjects))
{
var pdfFiles = Directory.GetFiles(extObjects, "*").Where(x=>x.EndsWith(".pdf"));
// Do something with the pdf file paths
}
}