如何读取给定目标中包含主文件的所有子目录

时间:2011-06-01 08:26:26

标签: c#

我遇到了问题。

我的问题是读取包含主文件的给定目标中的所有子目录。

我可以阅读子目录,但我正在创建一个项目,该项目只读取目录中应包含主文件的给定目录。

在给定目录中,应该有一个名为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                
            }

有什么办法吗? 对我的问题有任何建议。

4 个答案:

答案 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 - 块中。

修改

您可能想要使用EnumerateDirectoriessee MSDN for details.