递归调用重载方法

时间:2015-06-16 03:04:55

标签: c#

我正在尝试使用以下代码递归显示tmp文件的数量。但是当我将DirSearch()称为递归目的时;我得到一个错误没有重载方法可以采取1个参数。

namespace TestForm
{
    public partial class TEST : Form
    {
        public TEST()
        {
            InitializeComponent();
        }


        private void button1_Click(object sender, EventArgs e)
        {
          TEST search = new TEST();
            search.DirSearch();
            int result = search.DirSearch();
            label1.Text = result.ToString();

        }

        public  int DirSearch()
        {

            int count = 0;
            var sDir = Directory.GetFiles(@"C:\", "*.tmp", SearchOption.AllDirectories);

            try
            {

                foreach (string d in sDir)
                {
                    foreach (string f in Directory.GetFiles(d, "*.tmp"))
                    {
                        string extension = Path.GetExtension(f);
                        if (extension != null && (extension.Equals(".tmp")))
                        {
                            count++;
                            return count;
                        }
                    }
                    DirSearch(d);

                }
            }
            catch (UnauthorizedAccessException)
            {

            }             

        }         

    }        
}

4 个答案:

答案 0 :(得分:3)

我认为您对您尝试实施的递归算法略有误解。

要使递归方法起作用,它需要对输入进行操作,然后在派生输入上再次(递归地)调用自身。

你的DirSearch()方法不接受任何输入,因此它会一遍又一遍地计算同样的东西。您需要将根路径传递给递归算法将启动的方法,因此签名应更改为:

public  int DirSearch(string rootPath)

然后改变:

var sDir = Directory.GetFiles(rootPath, "*.tmp", SearchOption.AllDirectories);

现在在DirSearch方法的主体中,您必须枚举提供的路径中的所有目录,然后使用这些目录的完整路径调用DirSeach方法:

DirSearch(d)

答案 1 :(得分:0)

你对DirSearch()的定义没有任何争论,所以你不能用方向来称呼它。 也许你可以删除这个

var sDir = Directory.GetFiles(@"C:\", "*.tmp", SearchOption.AllDirectories);
从您的方法

并在事件中调用DirSearch()之前添加它,将第一个sDir作为参数传递,并在方法定义中添加参数。

此外,您应该考虑正确处理异常

答案 2 :(得分:0)

您是否只是想在C:\驱动器上获取* .tmp文件的数量?如果是这样,这应该可以解决问题:

int fileCount = Directory.GetFiles(@"C:\", "*.tmp", SearchOption.AllDirectories).Length;

也许我错过了一些东西 - 但是我不确定你为什么要在那个方法中做其他所有事情,或者这里的递归点是什么。

答案 3 :(得分:0)

在编写recursive代码时,您应该保持谨慎。

在你的程序/示例中

  1. 您的方法signature必须与DirSearch匹配。
  2. return count;语句中,代码在计算一个文件后返回。你不算所有这些。
  3. 请注意,递归伴随着额外的性能压力(可能不适用于所有情况,我会留给你探索你的情况)。

    下面的代码可以帮助您完成所需的工作。

    public static int DirSearch(string root)
    {
        int count = Directory.GetFiles(root, "*.tmp", SearchOption.TopDirectoryOnly).Count();
        foreach (string dir in Directory.GetDirectories(root))
        {
            count += Directory.GetFiles(dir, "*.tmp", SearchOption.TopDirectoryOnly).Count();
            count += DirSearch(dir);
        }
    
        return count;
    }  
    

    希望这会有所帮助!!