关于递归函数,如何解决这个问题?

时间:2013-12-14 19:41:59

标签: c#

请帮我更正此代码,以便检查可移动驱动器的任何子文件夹中是否有特定文件。

    private void timer2_Tick(object sender, EventArgs e)
    {
         DriveInfo[] ListDrives = DriveInfo.GetDrives();

        foreach (DriveInfo Drive in ListDrives)
        {
            if (Drive.DriveType == DriveType.Removable)
            {
                string[] dr = Directory.GetDirectories(@"F:");
                for (int i = 0; i <= dr.GetUpperBound(0); i++)
                {
                    parisa(dr[i]);
                }
            }
        }
    }

    private void parisa(string address)
    {
        string[] files = Directory.GetFiles(address);
        for (int i = 0; i <= files.GetUpperBound(0); i++)
        {
            if(files[i].IndexOf("autorun.inf") != -1)
            {
                MessageBox.Show("The USB is Viral");
            }
            else{
                MessageBox.Show("The USB is Safe");
            }
        }

        string[] z = Directory.GetDirectories(address);
        for (int i = 0; i <= z.GetUpperBound(0); i++)
        {
            parisa(z[i]);
        }
    }
    }

此代码无法正常运行。我创建了一个“autorun.inf”子文件夹,但它显示它是安全的!

1 个答案:

答案 0 :(得分:2)

您说该程序未检测到名为autorun.inf的文件夹。那是因为你不区分文件夹的名称。您只能区分文件名。在parisa方法的开头添加对目录名称的检查。

对于您的测试,您还应该使用StringComparison.OrdinalIgnoreCase,因为Windows上的文件名不区分大小写。

这样的事情似乎就是你想要的:

private void parisa(string directory)
{
    if(directory.IndexOf("autorun.inf", StringComparison.OrdinalIgnoreCase) != -1)
    {
        MessageBox.Show("The USB is Viral");
    }
    ....
}

显然,目录名的测试是对文件名测试的补充。

你的for循环有点不寻常。迭代数组通常使用foreach循环完成。

foreach (string filename in Directory.GetFiles(directory))
{
    ....
}

除此之外,使用消息框提供反馈是不切实际的,并且执行得很糟糕。您为每个遇到的对象显示一个消息框。只要找到不包含魔术文件名的文件,就会显示一个消息框。然后再次为下一个文件。等等。

您确实需要更改递归函数,以便在找到魔术文件名时返回布尔值。并在递归之外显示消息框。像这样:

private bool find(string directory, string target)
{
    if (directory.IndexOf(target, StringComparison.OrdinalIgnoreCase) != -1)
        return true;

    foreach (string filename in Directory.GetFiles(directory))
        if (filename.IndexOf(target, StringComparison.OrdinalIgnoreCase) != -1)
            return true;

    foreach (string subdir in Directory.GetDirectories(directory))
        if (find(subdir, target))
            return true;

    return false;
}

这里似乎相当缺乏清晰度。在评论中,显然您要做的就是搜索名为autorun.inf的文件。这是微不足道的:

Directory.GetFiles(@"F:\", "autorun.inf", SearchOption.AllDirectories)