2013-06-24 7 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

Я думаю, что ваш кто le интересует этот вопрос: 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

Попробуйте вставить Console.WriteLine (crtDI.FullName) перед FixAccess (crtDI) или MessageBox.Show (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