2010-10-06 13 views
6

मेरे पास एक ऐसा फ़ंक्शन है जो वर्तमान में सभी फ़ोल्डरों और उप-फ़ोल्डरों को पकड़ता है ताकि एसीएल को एक छोटे से टूल के लिए जांच सकें, लेकिन मैं अपने बालों को खींच रहा हूं यह समझने की कोशिश कर रहा है कि गहराई को कैसे सीमित किया जा सकता है। उदाहरण के लिए आपके पास एक फ़ोल्डर है जो 4 स्तरों को गहरा कर देता है लेकिन मैं एसीएल के लिए केवल 3 स्तरों को पकड़ने में सक्षम होना चाहता हूं।एक रिकर्सिव सब-डायरेक्टरी सर्च की गहराई को सीमित करने के लिए कैसे करें

वर्तमान में मैं यह thusly कोड किया है:

private void StepThroughDirectories(string dir) 
{ 
    string[] directories = Directory.GetDirectories(dir); 
    try 
    { 
     foreach (string d in Directory.GetDirectories(dir)) 
     { 
      if (recCount < (int)Depth) 
      { 
       GetACLs(d, new DirectoryInfo(d)); 
       pBar.Value += 1; 
       //MessageBox.Show("Recursive Level: " + counter.ToString()); 
       recCount++; 
       StepThroughDirectories(d); 
      } 
      else 
      { 
       recCount--; 
      } 
     } 
    } 
    catch (System.Exception e) 
    { 
     Console.WriteLine(e.Message); 
    } 
} 

जाहिर है कि के रूप में अच्छा के रूप में यह था, क्योंकि मैं थोड़ी देर के लिए, लेकिन किसी को भी सही दिशा में मुझे इंगित कर सकते हैं, तो इस समस्या पर काम कर रहा है नहीं है इस मुद्दे को हल करें मैं बहुत खुश होगा!

+0

क्या आप के लिए काम नहीं कर रहा? ऐसा लगता है कि यह कोड संकलित नहीं करता है - जहां रिकॉउंट घोषित किया गया है (और पीबीआर, और गहराई)? और आपकी (टिप्पणी की गई) MessageBox.Show का उपयोग काउंटर का उपयोग करता है .... –

उत्तर

18

सबसे पहले, बाहर recCount क्षेत्र घोषित करने के लिए एक "वैश्विक" चर के रूप में करने से बचें। पुनरावर्ती परिदृश्यों में यह रिकर्सिव कॉल के साथ राज्य को पारित करने के लिए आमतौर पर अधिक प्रबंधनीय होता है।

दूसरा, उपनिर्देशिका के लिए फ़ाइल सिस्टम की अनावश्यक क्वेरीिंग को हटाने के लिए foreach से गहराई परीक्षण को स्थानांतरित करें।

तीसरा, उप-निर्देशिका प्रसंस्करण पाश से फिर से, अपनी विधि की शुरुआत में वास्तविक प्रसंस्करण तर्क रखें।

आपका कोड तो देखो की तरह होगा:

void StepThroughDirectories(string dir) 
{ 
    StepThroughDirectories(dir, 0) 
} 

void StepThroughDirectories(string dir, int currentDepth) 
{ 
    // process 'dir' 
    ... 

    // process subdirectories 
    if (currentDepth < MaximumDepth) 
    { 
     foreach (string subdir in Directory.GetDirectories(dir)) 
      StepThroughDirectories(subdir, currentDepth + 1); 
    } 
} 
+0

आपने अभी मुझे दोपहर का सिरदर्द बचाया! धन्यवाद! –

+0

यह सुनकर बहुत अच्छा लगा, मुझे खुशी है कि मेरे समाधान ने आपकी मदद की। –

+3

वर्तमान डेपथ पास करने की बजाय, मेरी सामान्य प्राथमिकता गहराई से गुजरना होगा, जो कि नीचे की ओर गिना जाएगा। – supercat

5

एक संभावित विधि, अपनी विधि के बाहर एक वर्ग फ़ील्ड जोड़ें और एक चर यह इंगित करने के लिए कि कितने स्तर अधिकतम जाने के लिए गहरे हैं।

int स्तर;

private void StepThroughDirectories(string dir, int depth) 
{ 
    levels ++; 
    if (levels > depth) 
     return; 
    string[] directories = Directory.GetDirectories(dir); 
    try 
    { ... 
+0

दरअसल, 'स्तर' गहराई का प्रतिनिधित्व नहीं करता है, लेकिन 'StepThroughDirectories' कॉल की संख्या। – digEmAll

+1

इसका नकारात्मक पक्ष यह है कि आप एक बार में प्रगति पर StepThroughDirectories को दो कॉल नहीं कर सकते हैं (क्योंकि स्तरों को साझा किया जाना चाहिए)। हो सकता है कि इस आवेदक में कोई मुद्दा न हो लेकिन ओन्ड्रेज टुकी का समाधान अधिक आत्मनिर्भर और क्लीनर है। –

+0

@ पॉल अच्छा बिंदु। जवाब देने के दौरान मैंने इसके बारे में नहीं सोचा था। – jac

2

घटते क्रम में recCount जब आप StepThroughDirectories से लौटने के लिए, लेकिन यह बेहतर होगा ...

private void StepThroughDirectories(string dir, int depth) 
    { 
     if (depth < 0) 
      return; 
     string[] directories = Directory.GetDirectories(dir); 
     try 
     { 
      foreach (string d in Directory.GetDirectories(dir)) 
      { 
       // your code here 
       Console.WriteLine("{0}", d); 
       StepThroughDirectories(d, depth-1); 
      } 
     } 
     catch (System.Exception e) 
     { 
      Console.WriteLine(e.Message); 
     } 
    } 
+0

ठीक है, हाँ, यह उस त्रुटि का स्रोत है जिसे मैंने पहले नहीं देखा था। हालांकि, डिजाइन थोड़ा बेकार है, इसलिए इसे और अधिक पठनीय और प्रबंधनीय बनाने के लिए कुछ रिफैक्टरिंग सलाह भी होगी। –

+0

मेरे प्रस्तावित रिफैक्टर – Les

+0

जोड़ने के लिए मेरी पोस्ट संपादित की गई है अब तक जारी किए गए सभी सुझाव इस बात से सहमत हैं कि रिकर्सन के तहत राज्य को पारित करने के लिए एक अनुशंसित अभ्यास, बेहतर संयोजन, कमी युग्मन (ग्लोबल्स) है। – Les

संबंधित मुद्दे