Reputation: 329
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();
}
}
}
Upvotes: 3
Views: 5554
Reputation: 1186
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;
}
}
}
Upvotes: 1
Reputation: 47
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);
}
}
Upvotes: 3