C# 比较两个文件夹-模板与实际文件夹

C# 比较两个文件夹-模板与实际文件夹,c#,directoryinfo,C#,Directoryinfo,我试图将模板文件夹与现有目录结构的子文件夹进行比较。我试图递归地遍历每个目录中的所有子文件夹。我的代码如下 public void compareDirectories(DirectoryInfo Templatedir, DirectoryInfo Projectdir) { DirectoryInfo[] recursiveTemplatedirs = Templatedir.GetDirectories("*.*"); DirectoryInfo[] recursivePr

我试图将模板文件夹与现有目录结构的子文件夹进行比较。我试图递归地遍历每个目录中的所有子文件夹。我的代码如下

public void compareDirectories(DirectoryInfo Templatedir, DirectoryInfo Projectdir)
{
    DirectoryInfo[] recursiveTemplatedirs = Templatedir.GetDirectories("*.*");
    DirectoryInfo[] recursiveProjectdirs = Projectdir.GetDirectories("*.*");

    string recursiveName;
    string projectName;

    foreach (DirectoryInfo recursiveTemplatedir in recursiveTemplatedirs) 
    {
        recursiveName = recursiveTemplatedir.Name.ToString();
        foreach (DirectoryInfo recursiveProjectdir in recursiveProjectdirs)
        {
            projectName = recursiveProjectdir.Name.ToString();
            if (recursiveName == projectName)
            {
                lstTest.Items.Add("Match " + recursiveName);
            }
            else lstTest.Items.Add("No Match " + recursiveName);
        }

        compareDirectories(recursiveTemplatedir, recursiveProjectdir);
    }
}

当我试着运行它时,我得到一个错误,递归项目目录在此上下文中不存在。有没有想过如何让它运行

出现错误是因为
recursiveProjectdir
的作用域仅在
foreach循环中

foreach (DirectoryInfo recursiveTemplatedir in recursiveTemplatedirs) 
    {
        recursiveName = recursiveTemplatedir.Name.ToString();
        foreach (DirectoryInfo recursiveProjectdir in recursiveProjectdirs)
        {
        }
        //recursiveProjectdir doesn't exists outside the foreach loop
        compareDirectories(recursiveTemplatedir, recursiveProjectdir);
    }

将最后一个CompareDirectory移动到foreach循环中。刚刚修改了你的测试方法

public static void compareDirectories(DirectoryInfo Templatedir, DirectoryInfo Projectdir)
{
    DirectoryInfo[] recursiveTemplatedirs = Templatedir.GetDirectories("*.*");
    DirectoryInfo[] recursiveProjectdirs = Projectdir.GetDirectories("*.*");

    string recursiveName;
    string projectName;

    foreach (DirectoryInfo recursiveTemplatedir in recursiveTemplatedirs) 
    {
        recursiveName = recursiveTemplatedir.Name.ToString();
        foreach (DirectoryInfo recursiveProjectdir in recursiveProjectdirs)
        {
            projectName = recursiveProjectdir.Name.ToString();
            if (recursiveName == projectName) {
              Console.WriteLine("Match " + recursiveName);
            } else 
              Console.WriteLine("No Match " + recursiveName);

        compareDirectories(recursiveTemplatedir, recursiveProjectdir);
        }

    }
}

逐步检查代码。这两个参数是否都被传递到
compasreDirectories
不为null?recursiveProjectdir仅在第二个foreach作用域中有效。无法运行此操作,您将无法编译此操作。如果您只关心目录,则可以使用。注意:仅在.NET4中可用。是否有一种方法可以将recursiveProjectdir传递出foreach循环。最后,我尝试比较两个位置的目录,然后使用模板目录上设置的ACL权限更改现有目录上的ACL权限。
recursiveProjectdir
位于foreach循环内。您希望在foreach外部使用哪个递归ProjectDir实例?您只需在foreach外部声明一个变量,并在foreach内部为其赋值。通过这种方式,您可以在foreach外部使用
recursiveProjectdir