c#当路径未知时找到FOLDER然后列出文件并返回

时间:2011-10-13 21:38:37

标签: c#

我正在学习c#,并且在完整路径未知时需要找到一个文件夹。例如,您可以知道专辑名称,但不知道音乐文件夹中的艺术家。查找专辑名称不是此代码的最终用法,而是此问题的最佳示例。我这样做是通过递归和限制搜索的深度。一切都很好,除非我找到文件夹并列出我希望它停止并返回的文件,但它没有,它只是在我拥有该文件夹后保持递归。我也在处理异常处理方面遇到困难,例如如果权限无效,如何跳过文件夹。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

     namespace listFoldersTest
    {
        class Program
        {
            static void Main(string[] args)
            {
                Console.SetWindowSize(100, 50);
                DirectoryInfo dir = new DirectoryInfo(@"C:\Users\username\Music");
                getDirsFiles(dir, 0, 2);
                Console.ReadKey();
                Console.WriteLine("done");
            }
            public static void getDirsFiles(DirectoryInfo d, int currentDepth, int maxDepth)
            {
                String folderToFindName = ("albumName");
                bool foundIt = false;

                if (currentDepth < maxDepth)
                {
                    DirectoryInfo[] dirs = d.GetDirectories("*.*");
                    foreach (DirectoryInfo dir in dirs)
                    {
                        String pathName = (dir.FullName);
                        Console.WriteLine("\r{0} ", dir.Name);
                        if (currentDepth == (maxDepth - 1))
                        {                                                                                                                                         
                            if (pathName.IndexOf(folderToFindName) != -1)
                            {
                                foundIt = true;
                                FileInfo[] files = dir.GetFiles("*.*");
                                foreach (FileInfo file in files)
                                {
                                    Console.WriteLine("-------------------->> {0} ", file.Name);
                                } //end foreach files

                            } // end if pathName

                        } // end if of get files current depth

                        if (foundIt == true)
                        {
                            return;
                        }
                        getDirsFiles(dir, currentDepth + 1, maxDepth);

                    } //end if foreach directories

                } //end if directories current depth

            } // end getDirsFiles function
        }
    }

4 个答案:

答案 0 :(得分:0)

我认为您想要做的是break中的foreach

if (foundIt == true)
{
    break; // instead of return
}

修改
 ......当然,你需要让foundIt成为一名班级成员。当前范围应用于方法的每次迭代。

答案 1 :(得分:0)

  • 在全局范围内创建布尔值。
  • 默认为false。
  • 找到文件夹后,将其设置为true。
  • 在递归函数中,如果值为true,则返回并退出函数而不执行任何操作。

在您的情况下,foundIt变量在函数内声明并初始化。在全局级别声明它,并在函数中首先检查它。

对于异常处理,只需使用try / catch并在函数失败时退出该函数。

答案 2 :(得分:0)

using System;
using System.IO;

namespace listFoldersTest
{
  class Program
  {
    private static bool foundIt;

    static void Main(string[] args)
    {
        Console.SetWindowSize(100, 50);
        try
        {
            DirectoryInfo dir = new DirectoryInfo(args[0]);
            getDirsFiles(dir, 0, 2);
        }
        catch
        {
        }
        Console.ReadKey();
        Console.WriteLine("done");
    }

    public static void getDirsFiles(DirectoryInfo d, int currentDepth, int maxDepth)
    {
        if(d == null || foundIt) return;
        String folderToFindName = ("albumName");
        if (currentDepth < maxDepth)
        {
            DirectoryInfo[] dirs = d.GetDirectories("*.*");
            foreach (DirectoryInfo dir in dirs)
            {
                String pathName = (dir.FullName);
                Console.WriteLine("\r{0} ", dir.Name);
                if (currentDepth == (maxDepth - 1))
                {
                    if (pathName.IndexOf(folderToFindName) != -1)
                    {
                        foundIt = true;
                        FileInfo[] files = dir.GetFiles("*.*");
                        foreach (FileInfo file in files)
                        {
                            Console.WriteLine("-------------------->> {0} ", file.Name);
                        } //end foreach files
                        return;
                    } // end if pathName
                } // end if of get files current depth
                getDirsFiles(dir, currentDepth + 1, maxDepth);
            } //end if foreach directories
        } //end if directories current depth
    } // end getDirsFiles function
  }
}

答案 3 :(得分:0)

您可以使用下面不使用全局变量的解决方案。

  public static string FindFolder(DirectoryInfo rootDirectory, string folderToFind, int currentDepth, int maxDepth)
    {
        if(currentDepth == maxDepth)
        {
            return null;
        }

        foreach(var directory in rootDirectory.GetDirectories())
        {
            Console.WriteLine(directory.FullName);

            if(directory.Name.Equals(folderToFind,StringComparison.OrdinalIgnoreCase))
            {
                return directory.FullName;
            }

            string tempFindResult;

            if((tempFindResult = FindFolder(directory,folderToFind,++currentDepth,maxDepth)) != null)
            {
                return tempFindResult;
            }
        }

        return null;
    }