Dobz
Dobz

Reputation: 1213

Make C# Search Hard-Drive Exclude Directory

Program goes through directories and prints Avi files to textbox

    public FileList()
    {
        InitializeComponent();
        //Sets Drive Choices
        DriveInfo[] drives = DriveInfo.GetDrives();
        foreach (DriveInfo d in drives)
        {
            driveChoice.Items.Add(d);
        }
    }

    //Find Video Files
    private void btnStart_Click(object sender, EventArgs e)
    {            
        String path = driveChoice.Text;
        if (path != "C:\\")
        {
            String[] allfiles = Directory.GetFiles(path, "*.avi*", System.IO.SearchOption.AllDirectories);
            foreach (String file in allfiles)
            {
                tbFileList.Text = tbFileList.Text + file + "\r\n";
            }
        }
        else
        {
            Application.Exit();
        }

    }
}

When ran I get an error.

Unauthorized Access 'I:\$RECYCLE.BIN\S-1-5-21-1332477098-3306142970-3529014387-1000\'

Can I set the program to just skip 'I:\$RECYCLE.BIN'

Upvotes: 0

Views: 3334

Answers (5)

FEY'S CONTROL
FEY'S CONTROL

Reputation: 1

I just tried the usage of the Lambda expression of excluding both folders from the returned string list in VS 2017. I observed something strange. If the lambda expression is directly added to the retrieval of the directories as in the string shown above the list still returns $RECYCLEBIN, however SVI folder is not returned. In order to make the lambda working correctly I needed to separate the 2 actions i.e:

 var allDirs = rootDir.GetDirectories("*",SearchOption.TopDirectoryOnly);
 var filteredDirs = allDirs.Where(d=> !d.Name.Equals("System Volume Information") && !d.Name.Equals("$RECYCLE.BIN"));

Upvotes: 0

user2040424
user2040424

Reputation:

Use a lambda statement to exclude the system directories:

public FileList()
{
    InitializeComponent();
    //Sets Drive Choices
    DriveInfo[] drives = DriveInfo.GetDrives();
    foreach (DriveInfo d in drives)
    {
        driveChoice.Items.Add(d);
    }
}

//Find Video Files
private void btnStart_Click(object sender, EventArgs e)
{            
    String path = driveChoice.Text;
    if (path != "C:\\")
    {
        DirectoryInfo root = new DirectoryInfo(path);
        var rootFiles = root.GetFiles("*.avi");
        var rootDirs = root.GetDirectories("*", SearchOption.TopDirectoryOnly).Where(d => !d.Name.Equals("System Volume Information") && !d.Name.Equals("$RECYCLE.BIN"));
        foreach (var file in rootFiles)
        {
            tbFileList.Text = tbFileList.Text + file.FullName + "\r\n";
        }
        foreach (var dir in rootDirs)
        {
            foreach (var dirFile in dir.GetFiles("*.avi", SearchOption.AllDirectories))
            {
                tbFileList.Text = tbFileList.Text + dirFile.FullName + "\r\n";
            }
        }

    }
    else
    {
        Application.Exit();
    }

}

Upvotes: 0

Roy Ashbrook
Roy Ashbrook

Reputation: 854

Looks like you need to switch to a recursive solution or some other loop rather than using 'AllDirectories'. That way you can provide some skip logic.

see this link http://support.microsoft.com/kb/303974

and this code snippet from that page:

void DirSearch(string sDir) 
    {
        try 
        {
            foreach (string d in Directory.GetDirectories(sDir)) 
            {
                foreach (string f in Directory.GetFiles(d, txtFile.Text)) 
                {
                    lstFilesFound.Items.Add(f);
                }
                DirSearch(d);
            }
        }
        catch (System.Exception excpt) 
        {
            Console.WriteLine(excpt.Message);
        }
    }

In that code you would just check your sDir for the values you want to skip.

Upvotes: 1

JaredPar
JaredPar

Reputation: 754725

Now there is no way to have the AllDirectories option skip specific directories or ignore exceptions that occur from traversing. You will need to manually search the directory structure and deal with errors that occur

Upvotes: 1

iefpw
iefpw

Reputation: 7042

if !filePath.Contains("I:\$RECYCLE.BIN")

Upvotes: 0

Related Questions