2012-06-06 45 views
1

假設我有一個將主文件夾內的文件傳輸到其他位置的應用程序。查找文件夾循環引用

例如,用戶可以配置如下的應用程序:

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 

這種層次結構可以得到相當複雜。首先預測它們並防止這種配置的最好方法是什麼?

+0

簡單而明顯的解決方案是隻遵循每個文件自上而下的規則。 –

回答

4

假設有這樣一個類:

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

幷包含所有的規則由名爲rulessourceDir索引的字典。

您可以編寫一個函數是這樣的:

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

如果假設每個源目錄只有一個目標目錄(你不需要從同一個源目錄創建兩個副本),這是比其他答案更好的解決方案。如果它不成立,你可以添加一個循環(而不是使用字典),但它可能會非常快地花費資源。 – Filip

+0

如果您有多個具有相同來源的規則,則需要帶有列表的字典。除非你有數百萬條規則,否則它不會獲得資源密集或緩慢 – tumtumtum