2010-10-06 42 views
6

Tôi có một chức năng hiện đang lấy tất cả các thư mục và thư mục con để kiểm tra ACL cho một công cụ nhỏ mà tôi đang xây dựng nhưng tôi đang kéo tóc ra cố gắng tìm ra cách giới hạn chiều sâu mà nó có thể đi đến. Ví dụ bạn có một thư mục mà đi 4 cấp độ sâu nhưng tôi muốn để có thể chỉ lấy 3 cấp độ của nó cho ACL.Làm thế nào để giới hạn chiều sâu của một thư mục con tìm kiếm đệ quy

Hiện nay tôi có nó mã hóa 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); 
    } 
} 

Rõ ràng đó không phải là tốt đẹp như nó là vì tôi đã làm việc trên vấn đề đối với một thời gian ngắn nhưng nếu có ai có thể chỉ cho tôi đi đúng hướng để giải quyết vấn đề này tôi sẽ rất hạnh phúc!

+0

gì là không làm việc cho bạn? Có vẻ như mã này không biên dịch - recCount được khai báo ở đâu (và pBar, và Depth)? và của bạn (nhận xét ra) MessageBox.Show sử dụng truy cập thay vì .... –

Trả lời

18

Thứ nhất, tránh tuyên bố lĩnh vực recCount bên ngoài như là một biến “toàn cầu”. Trong các kịch bản đệ quy, nó thường dễ quản lý hơn để vượt qua trạng thái dọc theo các cuộc gọi đệ quy.

Thứ hai, hãy di chuyển thử nghiệm độ sâu ra khỏi foreach để xóa truy vấn không cần thiết của hệ thống tệp cho thư mục con.

Thứ ba, đặt logic xử lý thực tế ở đầu phương thức của bạn, một lần nữa ra khỏi vòng lặp xử lý thư mục con.

Mã của bạn sau đó sẽ như thế nào:

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

Bạn vừa mới cứu tôi một cơn đau đầu buổi chiều! Cảm ơn bạn! –

+0

Thật tuyệt khi nghe điều đó, tôi rất vui vì giải pháp của tôi đã giúp bạn. –

+3

Thay vì truyền dòng điệnDepth, tùy chọn thông thường của tôi sẽ là để vượt qua depthLimit, mà sẽ đếm ngược thay vì lên. – supercat

5

Một phương pháp có thể, thêm trường lớp bên ngoài phương thức của bạn và một biến để cho biết số lượng các cấp độ sâu cần tối đa.

mức int;

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

Thực ra, 'các cấp' không đại diện cho độ sâu, nhưng số lượng các cuộc gọi' StepThroughDirectories'. – digEmAll

+1

Nhược điểm của điều này là bạn không thể có hai cuộc gọi đến StepThroughDirectories đang tiến hành cùng một lúc (vì các cấp sẽ được chia sẻ). Có lẽ không phải là một vấn đề trong applicatiom này nhưng giải pháp của Ondrej Tucny là tự chứa và sạch hơn. –

+0

@Paul Điểm tốt. Tôi không nghĩ về điều đó trong khi trả lời. – jac

2

Decrement recCount khi bạn trở về từ StepThroughDirectories, nhưng điều này sẽ tốt hơn ...

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

Vâng, vâng, đó là nguồn gốc của lỗi mà tôi không nhận thấy lúc đầu. Tuy nhiên, thiết kế hơi vụng về, do đó, một số tái cấu trúc để làm cho nó dễ đọc hơn và dễ quản lý hơn cũng sẽ được tư vấn. –

+0

Chỉnh sửa bài viết của tôi để thêm refactor đề xuất của tôi – Les

+0

Tất cả các đề xuất được đăng cho đến nay dường như đồng ý trong đó đi tiểu bang xuống đệ quy là một thực hành được đề nghị, sự gắn kết tốt hơn, giảm khớp nối (để globals). – Les

Các vấn đề liên quan