递归函数中的计数器

3

我需要在这个递归函数中计算被删除的文件数量。由于它是递归的,所以我不能使用if语句,并且C#不支持全局变量。有什么替代方法吗?

static void DirSearch(string path)
{
    try
    {
        foreach (string dirPath in Directory.GetDirectories(path))
        {
            foreach (string filePath in Directory.GetFiles(dirPath))
            {
                string filename = Path.GetFileName(filePath);
                if (filename.Equals("desktop.txt"))
                {
                    File.Delete(filePath);
                    //count++
                }
                Console.WriteLine(filePath); // print files
            }
            Console.WriteLine(dirPath); // print directories
            DirSearch(dirPath);
        }
    }
    catch (System.Exception excpt)
    {
        Console.WriteLine(excpt.Message);
    }
}

2
当然,C#支持全局变量。你从哪里得到它不支持的想法?!另外,你有没有考虑过传入一个额外的参数来保持删除文件数量的记录?在你的方法中添加一个计数器的额外参数。 - Ahmed ilyas
@Ahmedilyas 从技术上讲,它并不是这样,因为它们都是某种类型的成员。 - Lloyd
顺便提一下,我会重命名这个函数。搜索表明它将遍历数据源并返回有关其信息,但该函数正在删除所有desktop.txt文件。最好还添加一个文件名参数,而不是将其硬编码为desktop.txt。 - Dan Lyons
@DanLyons:同意!这段代码只是为了说明问题。 - SharkTiles
4个回答

14

一种方法是传入需要计数的内容。 我会使用 ref 来实现这个功能,例如:

static void DirSearch(string path, ref int count)
{
    try
    {
        foreach (string dirPath in Directory.GetDirectories(path))
        {
            foreach (string filePath in Directory.GetFiles(dirPath))
            {
                string filename = Path.GetFileName(filePath);
                if (filename.Equals("desktop.txt"))
                {
                    File.Delete(filePath);
                    count++
                }
                Console.WriteLine(filePath); // print files
            }
            Console.WriteLine(dirPath); // print directories
            DirSearch(dirPath,ref count);
        }
    }
    catch (System.Exception excpt)
    {
        Console.WriteLine(excpt.Message);
    }
}

然后调用它:

int count = 0;

DirSearch(@"C:\SomePath",ref count);

然后你可以像在代码中注释掉一样正常使用count


需要将“引用计数(ref count)”作为参数传递给递归调用的DirSearch函数。 - xofz
2
为什么要使用 ref,而不是返回受影响的目录数量? - Dustin Kingen
+1。返回已处理文件数量比使用 ref 更加简洁。 - Alexei Levenkov
你说得对,你也可以像@wdosanjos的回答一样使用return,完全取决于你的喜好,我也已经点赞了他的回答。 - Lloyd

8
尝试使用以下递归的代码实现 count。因此,DirSearch 将返回已删除文件的 count
static int DirSearch(string path)
{
    int count = 0;

    try
    {
        foreach (string dirPath in Directory.GetDirectories(path))
        {
            foreach (string filePath in Directory.GetFiles(dirPath))
            {
                string filename = Path.GetFileName(filePath);
                if (filename.Equals("desktop.txt"))
                {
                    File.Delete(filePath);

                    count++;
                }
                Console.WriteLine(filePath); // print files
            }
            Console.WriteLine(dirPath); // print directories
            count += DirSearch(dirPath);
        }
    }
    catch (System.Exception excpt)
    {
        Console.WriteLine(excpt.Message);
    }

    return count;
}

2
没有引用变量(因此您不需要传递正确初始化的内容):
static int DirSearch(string path)
{
    try
    {
        int count = 0;
        foreach (string dirPath in Directory.GetDirectories(path))
        {
            foreach (string filePath in Directory.GetFiles(dirPath))
            {
                string filename = Path.GetFileName(filePath);
                if (filename.Equals("desktop.txt"))
                {
                    File.Delete(filePath);
                    count++;
                }
                Console.WriteLine(filePath); // print files
            }
            Console.WriteLine(dirPath); // print directories
            count += DirSearch(dirPath);
        }
        return count;
    }
    catch (System.Exception excpt)
    {
        Console.WriteLine(excpt.Message);
    }
}

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接