我正在编写一个程序,该程序应该扫描一个特定的目录,查找其中具有特定名称的任何目录,如果找到它们,则告诉用户。
目前,我加载它搜索的名字的方式是这样的:
static string path = Path.Combine(Directory.GetCurrentDirectory(), @"database.txt");
static string[] database = File.ReadAllLines(datapath);
我将其用作查找特定目录时要查找的名称数组。我是用foreach方法来做的。
System.IO.DirectoryInfo di = new DirectoryInfo("C:ExampleDirectory");
foreach (DirectoryInfo dir in di.GetDirectories())
{
}
是否有一种方法可以查看文件"database.txt"匹配在"C:ExampleDirectory"中找到的任何目录名称?
我能想到的唯一方法是:
System.IO.DirectoryInfo di = new DirectoryInfo(versionspath);
foreach (DirectoryInfo dir in di.GetDirectories())
{
if(dir.Name == //Something...) {
Console.WriteLine("Match found!");
break;}
}
但这显然行不通,我想不出任何其他方法来做到这一点。任何帮助将非常感激!
根据你在stackoverflow上的其他问题,我推测你的问题是一个家庭作业,或者你是一个充满激情的业余程序员,对吗?我会试着解释这个原理继续你的几乎完整的解决方案。
这里需要一个嵌套循环,一个循环中的循环。在外部循环中,您遍历目录。你已经得到这个了。对于每个目录,您需要遍历database
中的名称,以查看其中是否有任何项与目录名称匹配:
System.IO.DirectoryInfo di = new DirectoryInfo(versionspath);
foreach (DirectoryInfo dir in di.GetDirectories())
{
foreach (string name in database)
{
if (dir.Name == name)
{
Console.WriteLine("Match found!");
break;
}
}
}
根据您的目标,您可能希望在第一个匹配目录处退出。上面的示例代码没有。单个break;
语句只退出内部循环,而不退出外部循环。所以它继续检查下一个目录。试着自己弄清楚如何在第一次匹配时停止(通过退出外部循环)。
像往常一样,LINQ是一种方法。当您需要在两个列表之间查找匹配或不匹配,并且两个列表包含不同类型时,您必须使用.Join()
或.GroupJoin()
。
.Join()
起作用,如果你需要找到一个1:1的关系,.GroupJoin()
为任何类型的1-to关系(1:0,1:多或1:1)。
因此,如果您需要匹配列表的目录,这听起来像是.Join()
操作符的作业:
public static void Main(string[] args)
{
// Where ever this comes normally from.
string[] database = new[] { "fOo", "bAr" };
string startDirectory = @"D:baseFolder";
// A method that returns an IEnumerable<string>
// Using maybe a recursive approach to get all directories and/or files
var candidates = LoadCandidates(startDirectory);
var matches = database.Join(
candidates,
// Simply pick the database entry as is.
dbEntry => dbEntry,
// Only take the last portion of the given path.
fullPath => Path.GetFileName(fullPath),
// Return only the full path from the given matching pair.
(dbEntry, fullPath) => fullPath,
// Ignore case on comparison.
StringComparer.OrdinalIgnoreCase);
foreach (var match in matches)
{
// Shows "D:baseFolderfoo"
Console.WriteLine(match);
}
Console.ReadKey();
}
private static IEnumerable<string> LoadCandidates(string baseFolder)
{
return new[] { @"D:baseFolderfoo", @"D:basefolderbaz" };
//return Directory.EnumerateDirectories(baseFolder, "*", SearchOption.AllDirectories);
}
您可以使用LINQ来完成此操作
var allDirectoryNames = di.GetDirectories().Select(d => d.Name);
var matches = allDirectoryNames.Intersect(database);
if (matches.Any())
Console.WriteLine("Matches found!");
在第一行中,我们获得所有目录名,然后使用Intersect()
方法查看哪些目录名同时出现在allDirectoryNames
和database