2013-06-24 2 views
2

Je rencontrais des problèmes lors de la tentative de définition d'attributs avec des dossiers dont les fichiers contenaient Readonly. Je pourrais définir les attributs du dossier mais pas les fichiers à l'intérieur.Définition des attributs de fichier récursivement sous-dossiers

Cela va définir les attributs, y compris les sous-dossiers, puis supprimer. Trouvé informations sur codeproject.

utiliser ceci:

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

Je pense que votre qui les besoins sont couverts par cette question: http://stackoverflow.com/questions/611921/how-do-i-delete-a-directory-with-read-only-files-in-c :-) – C4stor

Répondre

1

Vous pouvez utiliser la recherche en profondeur d'abord (version pile) ou souffle première recherche (version de file d'attente) pour traversal arbre pour voir vos dossiers, quelque chose comme ceci:

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

Je n'ai pas obtenir des erreurs avec cette méthode, mais n'a pas changé les autorisations pour une raison quelconque. Je définis un dossier sur la racine de la carte de stockage pour lire seulement et un fichier à l'intérieur. Travaille toujours dessus. – user2190928

+0

Essayez d'insérer une Console.WriteLine (crtDI.FullName) avant FixAccess (crtDI) ou MessageBox.Show (crtDI.FullName) pour voir si la méthode répertorie tous les dossiers dans le répertoire Stockage. Si c'est le cas, cela signifie que la méthode FixAccess ne fonctionne pas. – Thanatos

+0

J'ai édité le post avec une méthode que j'essaye. Je suis confus sur la façon de l'appeler. Je semble beaucoup plus simple pour un newb si cela fonctionne. – user2190928

1

Vous pouvez créer une fonction récursive pour faire le travail:

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

Récursivité. C'est un excellent moyen de parcourir une structure d'arbre. – someuser

Questions connexes