2013-08-23 31 views
0

我想遞歸命令添加到這個腳本,它可以遍歷當前direcotries子目錄/文件和設置子文件夾的權限/文件到任何我會喜歡。這是我迄今爲止允許在第一組子目錄中更改權限的內容。很顯然,我可以添加samecode文件夾結構,以保持俯衝下來,但不是每根文件夾將其內部子文件的相同。我想添加遞歸命令來遍歷所有子目錄,當沒有更多的時候,移動到下一個根文件夾。添加遞歸命令設置在C#中的子目錄權限

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 
using System.IO; 
using System.Security.AccessControl; 
using System.Management; 
using System.Management.Instrumentation; 

namespace ApplyPermissions 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 

     } 

     private void label1_Click(object sender, EventArgs e) 
     { 

     } 

     private void selectDirectoryBtn_Click(object sender, EventArgs e) 
     { 
      FolderBrowserDialog myFolderBrowserDialog = new FolderBrowserDialog(); 
      myFolderBrowserDialog.ShowDialog(); 
      selectedDirBox.Text = myFolderBrowserDialog.SelectedPath.ToString(); 

      try 
      { 
       DirectoryInfo myDirectoryInfo = new DirectoryInfo(selectedDirBox.Text); 
       foreach (DirectoryInfo currentDir in myDirectoryInfo.GetDirectories()) 
       { 

        toolStripStatusLabel1.Text = currentDir.Name; 
        DirectorySecurity DirSecurity = currentDir.GetAccessControl(); 
        DirSecurity.AddAccessRule(new FileSystemAccessRule(「Whatever permissions group I choose」, FileSystemRights.CreateFiles, AccessControlType.Allow));     
        currentDir.SetAccessControl(DirSecurity); 

        // Step thru each file within current Directory and assign access 
        foreach (FileInfo currentFile in currentDir.GetFiles()) 
        { 
         FileSecurity fileSecurity = currentFile.GetAccessControl(); 
         fileSecurity.AddAccessRule(new FileSystemAccessRule("Whatever permissions group I choose", FileSystemRights.FullControl, AccessControlType.Allow)); 
         currentFile.SetAccessControl(fileSecurity); 
        } 

        foreach (DirectoryInfo subDir in currentDir.GetDirectories()) 
        { 


         toolStripStatusLabel1.Text = currentDir.Name + "/" + subDir.Name; 
         DirectorySecurity allsubDirSecurity = subDir.GetAccessControl(); 
         allsubDirSecurity.AddAccessRule(new FileSystemAccessRule("Whatever permissions group I choose ", FileSystemRights.FullControl, AccessControlType.Allow)); 
         subDir.SetAccessControl(allsubDirSecurity); 

         // Step thru each file within current SubDirectory and assign access 
         foreach (FileInfo currentFile in subDir.GetFiles()) 
         { 
          FileSecurity fileSecurity = currentFile.GetAccessControl(); 
          fileSecurity.AddAccessRule(new FileSystemAccessRule("Whatever permissions group I choose", FileSystemRights.FullControl, AccessControlType.Allow)); 
          currentFile.SetAccessControl(fileSecurity); 
         } 
        } 
       } 

       labelFinished.Text = "Completed Successfully"; 
      } 
      catch (Exception ex) 
      { 
       MessageBox.Show(ex.Message + "/////////////////" + ex.StackTrace); 
      } 
     } 
    } 
} 

回答

0

首先,如果你的目標框架是4.0,建議您使用Directory.EnumerateFiles方法(你也可以找到第三個代碼,做同樣的事情。)

假設這是一個不走,你可以通過使用yield關鍵字來簡化你的遞歸處理,例如使基於產量遍歷方法 - 我展示了過濾功能,因爲它往往會在目錄遍歷廣告有用的應該給你的想法這一點。

static IEnumerable<string> traverse(string path, Func<string, bool> filter) 
{ 
    foreach (string f in Directory.GetFiles(path).Where(filter)) 
    { 
     yield return f; 
    } 

    foreach (string d in Directory.GetDirectories(path)) 
    { 
     foreach (string f in traverse(d, filter)) 
     { 
      yield return f; 
     } 
    } 
} 

然後你使用遍歷()這樣

var files = traverse(PATH, WHERE); 
foreach (string f in files) { DoWhatever; } 

你將不得不在你的指尖更容易重複使用的目錄遍歷。我知道,我不屈服的目錄在片段上方,但如果我要處理的文件和目錄,我想這個基礎上DirectoryInfo.GetFileSystemInfos方法來代替。

我忘了添加了產量的功能時,但它上市已經有一段時間了。