【问题标题】:how to read all the subdirectories in a given destination which contain Master File in it如何读取给定目标中包含主文件的所有子目录
【发布时间】:2011-06-07 05:14:28
【问题描述】:

我遇到了问题。

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

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

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

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

【问题讨论】:

    标签: c#


    【解决方案1】:

    我还没有测试过,但我很确定以下方法会起作用:

    string[] paths = Directory.GetFiles(dirPath, "MasterFile", SearchOption.AllDirectories);
    

    然后,如果您想遍历所有 MasterFile,您可以在结果数组上使用 foreach。或者,如果您只关心第一个结果,那么它只是 paths[0] - 当然,这意味着它会做一些额外的工作来查找所有匹配的路径。而且您可能不需要检查空数组,因为超出范围的索引将表明没有 MasterFile(除非您想捕获它,然后作为文件未找到异常或其他原因重新抛出)。

    【讨论】:

      【解决方案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"))
      

      【讨论】:

      • 什么是我需要为 Elements 添加的参考资料,请告诉我
      • 点击上面的链接codeproject.com/KB/linq/LinqToTree.aspx#filesystem 它有完整的源代码和一些例子。你需要自己做一些工作;-)
      • 酷 - 顺便说一句,你需要处理你的接受/赞成,你已经问了 6 个问题,但只赞成一个答案。如果您不开始接受/投票,人们将停止回答您的问题!
      【解决方案3】:

      这是我编写目录的代码,希望对你有所帮助。

       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(" ");
              }
      }
      

      【讨论】:

        【解决方案4】:

        这是一个递归示例,说明如何遍历目录结构并查找某个文件,一旦找到,就可以调用相应的方法。

            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-loop的末尾,你把它放在哪里取决于你什么时候想检测文件,你想深入然后爬回来检查主文件正在向上,还是要在进入下一个目录之前检查主文件?

        根据您的问题,您可能想在我的回答中交换它们,如果我理解正确,您可能甚至不想在找到一个主文件后转到下一个目录?

        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 的主文件,然后再往下走。如果您不关心某个子目录中的任何其他主文件,则可以将TraverseDirectory(pathToMasterFile) 嵌套在else-block 中。

        编辑

        您可能想使用EnumerateDirectoriessee MSDN for details.

        【讨论】:

        • 非常感谢它有效,但我的代码中还有另一个问题,当在子目录中找到 Master 时,dll 读取 dat 文件,我的行代码显示错误 Reader.ReadMaster(); //错误是找不到这样说的文件,因为它可以读取子目录,你能帮帮我吗
        • @G Arshiya,您需要将DoSomethingWithMaster(currentPath); 更改为:DoSomethingWithMaster(Path.Combine(currentPath, "Master")); 我已经更新了我的答案。
        • 在写读大师之前我需要写这行 Reader.OpenDirectory(test); Reader.ReadMaster();除了测试我应该写什么测试只读取一个目录而不是子目录除了测试我应该写什么你能说我吗
        • @G Arshiya,很抱歉,但我不完全理解您指的是什么?能详细点吗?
        • 我的 dll 只读取 dat 文件,您的代码会找到主文件,但是当我调试它时 Reader.ReadMaster;//error - File not found 。这意味着 readMaster 找不到要写入文本文件的 Dat 文件。当我编写 Reader.OppenDirectory(test); test 不包含任何 dat 文件它只包含子文件夹我想问你我应该写什么然后在 Reader.openDirectory() 中测试;你能说我吗
        猜你喜欢
        • 1970-01-01
        • 2021-01-05
        • 1970-01-01
        • 1970-01-01
        • 2011-08-05
        • 2014-11-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多