如何解决如何读取给定目标中包含主文件的所有子目录
| 我有一个问题。 我的问题是读取给定目标中包含主文件的所有子目录。 我可以读取子目录,但是我正在创建一个仅读取给定目录的项目,该目录应在目录中包含Master文件。 在给定目录中,应该存在一个称为“主文件”的文件。 我想编写代码,例如如果给定目录中不包含任何主文件,则应跳转到另一个目录。 我的源目录是@ \“ C:\\ test。 在@ \“ C:\\ test \”中,有许多文件夹和子文件夹。 测试目录包含\“ C:\\ test \\ test1 \\ test2 \\ test3。在此路径中,test3文件夹包含主文件test1,而test2没有。 我想写这样的代码, MLMReader Reader = new MLMReader();
Reader.OpenDirectory(@\"C:\\test\");
if (!File.Exists(test + \"\\\\Master\"))
{
//i want to loop the \"C\"\\\\\" and if test1 does not contain
// Master File then jump to another directory test2,if
//test2 directory contain Master File then the work should
// continue after finishing go to test3
}
有什么办法可以做。
对我的问题有任何建议。
解决方法
我还没有测试过,但是我很确定下面的方法会起作用:
string[] paths = Directory.GetFiles(dirPath,\"MasterFile\",SearchOption.AllDirectories);
然后,如果要遍历所有MasterFile,则只需对结果数组加2即可。或者,如果您只关心第一个结果,那么它只有3英镑-当然,这意味着查找所有匹配的路径要花点力气。而且您可能不需要检查空数组,因为超出范围的索引将指示没有MasterFile(除非您想捕获它,然后将其作为未找到的文件异常或其他原因重新抛出)。
, Linq-to-FileSystem允许您在文件系统上执行结构化查询。请参见以下示例:
var dir = new DirectoryInfo(@\"C:\\test\");
// find all subdirectories of test that contains a file / folder called \'Master\'
var dirs = dir.Elements()
.Where(d => d.Elements().Any(i => i.Name == \"Master\"))
, 这是我在目录中编程的代码,希望对您有所帮助。
using System;
using System.IO;
static void Print(string path,int? rec,int? tree,bool color,int? level = 0)
{
if ((rec != null && level > rec) || path == null) return;
if (rec == null) rec = 0;
string[] dir;
string[] fil;
try
{
dir = Directory.GetDirectories(path);
fil = Directory.GetFiles(path);
}
catch(Exception e)
{
Console.WriteLine(e.Message);
return;
}
foreach (string s in dir)
{
WriteSpace(level,tree);
Console.WriteLine(s);
Print(s,rec,tree,color,level + 1);
}
if (color)
{
ConsoleColor def = Console.ForegroundColor;
Console.ForegroundColor = ConsoleColor.Blue;
foreach (string s in fil) // vypis file
{
WriteSpace(level,tree);
Console.WriteLine(s);
}
Console.ForegroundColor = def;
}
else
{
foreach (string s in fil)
{
WriteSpace(level,tree);
Console.WriteLine(s);
}
}
}
private static void WriteSpace(int? level,int? tree)
{
for (int i = 0; i < level*tree; i++)
Console.Write(\" \");
}
}
, 这是一个递归示例,说明如何遍历目录结构并查找某个文件,一旦找到该文件,就可以调用相应的方法。
static void Main()
{
TraverseDirectory(@\"D:\\TestDirectory\");
}
static void DoSomethingWithMaster(string path)
{
Console.WriteLine(\"Found master at {0}\",path);
}
static void TraverseDirectory(string directory)
{
var currentDirectory = new DirectoryInfo(directory);
foreach(var dir in currentDirectory.GetDirectories())
{
var currentPath = dir.FullName;
TraverseDirectory(currentPath);
var pathToMasterFile = Path.Combine(currentPath,\"Master\");
if (File.Exists(pathToMasterFile))
DoSomethingWithMaster(pathToMasterFile);
}
}
我具有以下文件夹结构:
D:\\TestDirectory\\1
D:\\TestDirectory\\2
D:\\TestDirectory\\3
D:\\TestDirectory\\4
D:\\TestDirectory\\4\\Master
D:\\TestDirectory\\5
运行上述命令时,将打印:Found master at D:\\TestDirectory\\4
您所需要做的就是:
using System;
using System.IO;
您也可以将TraverseDirectory(currentPath);
移至foreach
循环的末尾,具体取决于您何时要检测文件,是否要深入然后返回自己的路径并在途中检查主文件上,还是要在输入下一个目录之前检查主文件?
根据您的问题,您可能想在我的答案中交换它们,如果我对您的理解正确,您甚至可能不想在找到一个主文件后转到下一个目录?
foreach(var dir in currentDirectory.GetDirectories())
{
var currentPath = dir.FullName;
var pathToMasterFile = Path.Combine(currentPath,\"Master\");
if (File.Exists(pathToMasterFile))
DoSomethingWithMaster(pathToMasterFile);
TraverseDirectory(currentPath);
}
在此示例中,它完全符合您在if
内的注释代码中所说的内容。它将首先检查TestDirectory \\ 1中是否有Master文件,然后再进行下一行操作。如果您不在乎一个子目录中的任何其他主文件,则可以将“ 14”嵌套在“ 15”块中。
编辑
您可能要使用EnumerateDirectories
,有关详细信息,请参见MSDN。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。