2013-06-24 50 views
2

我在試圖設置文件夾內有文件的設置爲Readonly時出現了問題。我可以設置文件夾屬性,但不能設置其中的文件。設置遞歸子文件夾的文件屬性

這將設置包含子文件夾的屬性,然後刪除。在codeproject.

發現信息使用此:

ScanDirectory scanDirectory = new ScanDirectory(); 
scanDirectory.WalkDirectory(@"/Storage Card"); 

public class ScanDirectory 
{ 
    public void WalkDirectory(string directory) 
    { 
     WalkDirectory(new DirectoryInfo(directory)); 
    } 

    private void WalkDirectory(DirectoryInfo directory) 
    { 
     // Scan all files in the current path 
     foreach (FileInfo file in directory.GetFiles()) 
     { 
      file.Attributes &= ~FileAttributes.ReadOnly; 
      file.Delete(); 
     } 

     DirectoryInfo[] subDirectories = directory.GetDirectories(); 

     // Scan the directories in the current directory and call this method 
     // again to go one level into the directory tree 
     foreach (DirectoryInfo subDirectory in subDirectories) 
     { 
      WalkDirectory(subDirectory); 
      subDirectory.Attributes &= ~FileAttributes.ReadOnly; 

      subDirectory.Delete(); 
     } 
    } 
} 
+0

我覺得你的誰樂的需要被這個問題所覆蓋:http://stackoverflow.com/questions/611921/how-do-i-delete-a-directory-with-read-only-files-in-c :-) – C4stor

回答

1

你可以使用樹的遍歷深度優先搜索(堆棧版本)或呼吸優先搜索(隊列版)看到你的文件夾,像這樣的:

static void Main(String[] args) 
{ 
    // Using breath-first search (BFS) 
    Queue<DirectoryInfo> myQueue = new Queue<DirectoryInfo>(); 

    // Your storage path here 
    myQueue.Enqueue(new DirectoryInfo("C:\\")); 

    while(myQueue.Count > 0) 
    { 
     // Look at the current directory 
     DirectoryInfo crtDI = myQueue.Dequeue(); 

     // Put the directories from the crt dir in a queue 
     foreach (DirectoryInfo otherDir in GetCrtDirectories(crtDI)) 
      myQueue.Enqueue(otherDir); 

     // Do what you want with the directory here 
     FixAccess(crtDI); 
    } 
} 

private static IEnumerable<DirectoryInfo> GetCrtDirectories(DirectoryInfo crtDI) 
{ 
    foreach(string dirStr in Directory.GetDirectories(crtDI.FullName)) 
    { 
     DirectoryInfo newDir = new DirectoryInfo(dirStr); 
     yield return newDir; 
    } 
} 

private static void FixAccess (DirectoryInfo DI) 
{ 
    foreach (string fileName in System.IO.Directory.GetFiles(DI.FullName)) 
    { 
     FileInfo fileInfo = new FileInfo(fileName); 
     FileAttributes attributes = fileInfo.Attributes; 

     if ((attributes & FileAttributes.ReadOnly) == FileAttributes.ReadOnly) 
     { 
      // set the attributes to nonreadonly 
      fileInfo.Attributes &= ~FileAttributes.ReadOnly; 
     } 
    } 
} 
+0

我沒有使用此方法獲得任何錯誤,但由於某種原因未更改權限。我在存儲卡的根目錄上設置了一個文件夾以便只讀和一個文件。仍在努力。 – user2190928

+0

嘗試在FixAccess(crtDI)或MessageBox.Show(crtDI.FullName)之前插入Console.WriteLine(crtDI.FullName),以查看該方法是否列出存儲目錄中的所有文件夾。如果確實如此,則意味着FixAccess方法不起作用。 – Thanatos

+0

我用我正在嘗試的方法編輯過文章。我很困惑如何調用它。如果它工作的話,我認爲newb更簡單一些。 – user2190928

1

您可以創建一個遞歸函數來完成這項工作:

private void UpdateFileAttributes(DirectoryInfo dInfo) 
    { 
     // Set Directory attribute 
     dInfo.Attributes &= ~FileAttributes.ReadOnly; 

     // get list of all files in the directory and clear 
     // the Read-Only flag 

     foreach (FileInfo file in dInfo.GetFiles()) 
     { 
      file.Attributes &= ~FileAttributes.ReadOnly; 
     } 

     // recurse all of the subdirectories 
     foreach (DirectoryInfo subDir in dInfo.GetDirectories()) 
     { 
      UpdateFileAttributes(subDir); 
     } 
    } 
+0

遞歸。這是遍歷樹結構的好方法。 – someuser