找出文件夹循环引用

时间:2012-06-06 22:20:21

标签: c# .net algorithm logic

假设我有一个应用程序将主文件夹中放置的文件传输到其他位置。

例如,用户可以按如下方式配置应用程序:

If placed in C:\X\A Transfer to C:\Z\A
If placed in C:\Y\B Transfer to C:\Z\B
. . .
. . .
直到现在,一切都很顺利。但是以下配置会创建无限的传输循环:

if placed in C:\X\A Transfer to C:\Z\A
if placed in C:\Z\A Transfer to C:\Z\B
if placed in C:\Z\B Transfer to C:\X\A

这种层次结构可能变得非常复杂。首先预测它们并防止这种配置的最佳方法是什么?

2 个答案:

答案 0 :(得分:4)

假设有一个这样的类:

class Rule
{
    public string sourceDir; // dir file placed
    public string targetDir; // dir to move to
}

包含由sourceDir命名为rules索引的所有规则的字典。

您可以编写如下函数:

public bool RuleCausesCycle(Rule rule)
{
    return RuleCausesCycle(rule, new HashSet(CaseInsensitiveComparer.Default));
}

private bool RuleCausesCycle(Rule rule, Set visited)
{
     Rule targetRule;

     if (visited.Contains(rule.sourceDir))
     {
         return true;
     }

     if (rules.TryGetValue(rule.targetDir, out targetRule))
     {
         visited.Add(rule.sourceDir);

         return RuleCausesCycle(targetRule, visited);
     }

     return false;
}

答案 1 :(得分:3)

您基本上是在有向图中寻找周期。我会使用像QuickGraph这样的图库:http://quickgraph.codeplex.com/wikipage?title=Strongly%20Connected%20Components&referringTitle=Documentation