【问题标题】:Clean approach to finding a folder's parent查找文件夹父级的干净方法
【发布时间】:2010-12-20 16:58:00
【问题描述】:

我有这段代码可以搜索给定起始目录的文件夹。找到文件夹后,我需要它的父级名称。以下代码有效,但非常难看。我有一个标志“sessionFound”来帮助打破嵌套的 foreach 循环。以下作品。我希望我能对此有所了解,看看我是否能得到一些关于如何使这个不那么冗长和更简洁的建议。

谢谢。

    private void SetProjectFolder(string sessionid)
        {

//IoC container gives the root directory to begin search.
            string[] supportDirs = Directory.GetDirectories(ApplicationContainer.SupportDirectory);
            bool sessionFound = false;

            foreach (string directory in supportDirs)
            {
                if (!sessionFound)
                {
                    foreach (string folder in Directory.GetDirectories(directory))
                    {
                        if (!sessionFound)
                        {
                            foreach (string productSubFolder in Directory.GetDirectories(folder))
                            {
                                if (productSubFolder.Contains(sessionid))
                                {
                                    _productName = Directory.GetParent(productSubFolder).Parent.Name;
                                    sessionFound = true;
                                    break;
                                }
                            }
                        }
                        else
                        {
                            break;
                        }
                    }
                }
                else
                {
                    break;
                }
            }
        }

【问题讨论】:

    标签: c# recursion directory


    【解决方案1】:

    试试这个:

    private void SetProjectFolder(string sessionid)
        {
            //This will simulate the contains statement
            string searchPattern = string.Format("*{0}*", sessionid);
            string[] supportDirs = Directory.GetDirectories(ApplicationContainer.SupportDirectory, searchPattern);
    
            foreach (string filteredFolder in supportDirs)
            {
                _productName = Directory.GetParent(filteredFolder).Name;
                break;
            }
        }
    

    【讨论】:

    • 重载的 Directory.GetDirectories 是我所需要的。因为我想搜索所有文件夹,而不仅仅是他的根目录,所以我使用了接受 SearchOption 枚举的重载。
    【解决方案2】:

    通过删除sessionFound,您最终会得到一个非常清晰直接的代码:

    private void SetProjectFolder(string sessionid)
    {
        //IoC container gives the root directory to begin search.
        string[] supportDirs = Directory.GetDirectories(ApplicationContainer.SupportDirectory);
    
        // search for product subfolder
        foreach (string directory in supportDirs)
        {
            foreach (string folder in Directory.GetDirectories(directory))
            {
                foreach (string productSubFolder in Directory.GetDirectories(folder))
                {
                    if (productSubFolder.Contains(sessionid))
                    {
                        // product sub-folder found, set it and exit
                        _productName = Directory.GetParent(productSubFolder).Parent.Name;
                        return;
                    }
                }
            }
        }
    
        // product sub-folder not found
        !!! handle error path
    }
    

    如果您的目录结构在上述搜索算法的意义上是静态的,我认为嵌套的foreach 语句没有问题。也许你可以将中间的foreach 开头的代码提取到一个单独的方法中,比如string FindProductSubfolderInFolder(Directory)

    【讨论】:

      猜你喜欢
      • 2021-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-22
      相关资源
      最近更新 更多