我遇到了问题。
我的问题是读取包含主文件的给定目标中的所有子目录。
我可以阅读子目录,但我正在创建一个项目,该项目只读取目录中应包含主文件的给定目录。
在给定目录中,应该有一个名为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
}
有什么办法吗? 对我的问题有任何建议。
答案 0 :(得分:3)
我没有测试过,但我很确定以下内容会有效:
string[] paths = Directory.GetFiles(dirPath, "MasterFile", SearchOption.AllDirectories);
如果您想浏览所有MasterFiles,那么您只需foreach
就可以得到生成的数组。或者,如果您只关心第一个结果,那么它只是paths[0]
- 当然,这意味着它会找到所有匹配路径的额外工作。并且您可能不需要检查空数组,因为超出范围的索引将表明没有MasterFile(除非您想捕获它然后重新抛出作为文件未找到异常或其他)。
答案 1 :(得分:2)
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"))
答案 2 :(得分:1)
这是我用directorys编程的代码,希望它能帮到你。
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(" ");
}
}
答案 3 :(得分:1)
这是一个关于如何遍历目录结构并查找某个文件的递归示例,一旦找到它就可以调用相应的方法。
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文件,然后再往下走。如果您在找到一个子目录后不关心任何其他主文件,则可以将TraverseDirectory(pathToMasterFile)
嵌套在else
- 块中。
修改强>
您可能想要使用EnumerateDirectories
,see MSDN for details.