[英]How can recursively search directories with multiple wildcards?
使用 C# (.NET),如何在給定目錄搜索掩碼的情況下搜索文件系統,如下所示:(?)
\\server\Scanner\images\*Images\*\*_*
例如,我需要先找到所有頂級目錄:
\\server\Scanner\images\Job1Images
\\server\Scanner\images\Job2Images
...然后我需要進一步處理搜索掩碼:
\\server\Scanner\images\Job1Images\*\*_*
\\server\Scanner\images\Job2Images\*\*_*
這似乎並不太復雜,但我一生都無法弄清楚......
如上所述,我使用的是 C# 和 .NET。 搜索可以嘗試定位目錄或文件。 (即 *.txt 或 <*目錄>)
像這樣:
頂級目錄:
//get Top level
string[] TopLevel = Directory.GetDirectories(path);
然后,您將必須使用通配符模式對該文件夾執行遞歸功能,例如:
// Only get subdirectories that begin with the letter "p."
string pattern = "p*";
string[] dirs = folder.GetDirectories(path, pattern);
我建議您使用通配符來獲取數組輸出,如果使用遞歸函數或直接查詢路徑,則將找出哪種方法是最佳方法。
編輯 :啊,.NET 4的新功能,因此您不必執行遞歸功能(感謝Matthew Brubaker)
IEnumerable<String> matchingFilePaths2 = System.IO.Directory.EnumerateFiles(@"C:\some folder to start in", filePatternToMatchOn, System.IO.SearchOption.AllDirectories);
第一答案:
//get all files that have an underscore - searches all folders under the start folder
List<String> matchingFilePaths = new List<string>();
String filePatternToMatchOn = "*_*";
FileUtilities.GetAllFilesMatchingPattern(@"C:\some folder to start in", ref matchingFilePaths, filePatternToMatchOn);
...
public static void GetAllFilesMatchingPattern(String pathToGetFilesIn, ref List<String> fullFilePaths, String searchPattern)
{
//get all files in current directory that match the pattern
String[] filePathsInCurrentDir = Directory.GetFiles(pathToGetFilesIn, searchPattern);
foreach (String fullPath in filePathsInCurrentDir)
{
fullFilePaths.Add(fullPath);
}
//call this method recursively for all directories
String[] directories = Directory.GetDirectories(pathToGetFilesIn);
foreach (String path in directories)
{
GetAllFilesMatchingPattern(path, ref fullFilePaths, searchPattern);
}
}
public static IEnumerable<string> GetImages()
{
//For each "*Image" directory
foreach (var jobFolder in Directory.EnumerateDirectories(@"\\server\Scanner\images", "*Images"))
{
//For each first level subdirectory
foreach (var jobSubFolder in Directory.EnumerateDirectories(jobFolder))
{
//Enumerate each file containing a '_'
foreach (var filePath in Directory.EnumerateFiles(jobSubFolder, "*_*", SearchOption.TopDirectoryOnly))
{
yield return filePath;
}
}
}
}
僅枚舉每個“ * Image”目錄的第一級子目錄中的文件。
最后,您可以將其用於:
foreach (var path in GetImages())
{
Console.WriteLine(path);
}
有一個 C# 過程,您可以在其中按路徑模式搜索文件夾,並使用 * 和 ? 等通配符。
例如,如果將路徑模式 C:\\Folder?*\\Folder2 傳遞給程序,則將返回文件夾路徑列表
C:\\文件夾 1\\A\\文件夾 2
C:\\文件夾A\\B\\文件夾2
...
等等
static List<string> GetFoldersByPathPattern(string folderPathPattern)
{
List<string> directories = new List<string>();
directories.Add("");
string[] folderParts = folderPathPattern.Split(new char[] { '\\' }, StringSplitOptions.None);
foreach (string folderPart in folderParts)
{
if (folderPart.Contains('*') || folderPart.Contains('?'))
{
List<string> newDirectories = new List<string>();
foreach (string directory in directories)
{
foreach (string newDirectory in Directory.GetDirectories(directory, folderPart))
{
newDirectories.Add(newDirectory);
}
}
directories = newDirectories;
}
else
{
for (int i = 0; i < directories.Count(); i++)
{
directories[i] = directories[i] + folderPart + "\\";
}
}
}
return directories;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.