3

I was having issues trying to set attributes with folders that had files inside that were set to Readonly. I could set the folder attributes but not files within.

This will set attributes including subfolders and then remove. Found info on codeproject.

to use this:

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();
        }
    }
}
Ryan
  • 26,884
  • 9
  • 56
  • 83
user2190928
  • 319
  • 1
  • 5
  • 21
  • I think your whole needs are covered by this question : http://stackoverflow.com/questions/611921/how-do-i-delete-a-directory-with-read-only-files-in-c :-) – C4stor Jun 24 '13 at 11:00

2 Answers2

3

You could create a recursive function to do the job:

    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);
        }
    }
someuser
  • 47
  • 3
1

You could use the depth-first search (stack version) or breath-first search (queue version) for tree traversal to see your folders, something like this:

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;
        }
    }
}
yanckst
  • 438
  • 4
  • 17
Thanatos
  • 1,176
  • 8
  • 18
  • I did not get any errors with this method but did not change permissions for some reason. I set a folder on the root of the storage card to read only and a file inside. Still working on it. – user2190928 Jun 24 '13 at 11:16
  • Try insert a Console.WriteLine(crtDI.FullName) before FixAccess(crtDI) or MessageBox.Show(crtDI.FullName) to see if the method lists all the folders in the Storage directory. If it does, it means the FixAccess method doesn't work. – Thanatos Jun 24 '13 at 11:27
  • I edited post with a method i am trying. I am confused about how to call it. I seems much more simpler for a newb if it works. – user2190928 Jun 24 '13 at 11:56
  • @user2190928 Make a console application, paste my code, modify private static void FixAccess(DirectoryInfo DI) { Console.WriteLine(DI.FullName); }, but I guess you are confused about static methods, if you use instances of class you should remove the static from all methods. – Thanatos Jun 24 '13 at 16:21
  • you should call the method with Main(null) or remove String[] args altogether from Main and just call it Main() or name it whatever you like. – Thanatos Jun 24 '13 at 16:29