检查数组中目录的名称



我正在编写一个程序,该程序应该扫描一个特定的目录,查找其中具有特定名称的任何目录,如果找到它们,则告诉用户。

目前,我加载它搜索的名字的方式是这样的:

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()方法查看哪些目录名同时出现在allDirectoryNamesdatabase

相关内容

  • 没有找到相关文章

最新更新