Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C# Searching for files and folders except in certain folders

Is there any way to exclude certain directories from SearchOption using LINQ command like this

string path = "C:\SomeFolder";

var s1 = Directory.GetFiles(path , "*.*", SearchOption.AllDirectories);

var s2 = Directory.GetDirectories(path , "*.*", SearchOption.AllDirectories);

The path consists of Sub1 and Sub2 Folders with certain files in it. I need to exclude them from directory search.

Thanks

This Worked:

string[] exceptions = new string[] { "c:\\SomeFolder\\sub1",
"c:\\SomeFolder\\sub2" };

var s1 = Directory.GetFiles("c:\\x86", "*.*",
SearchOption.AllDirectories).Where(d => exceptions.All(e =>
!d.StartsWith(e)));

This helped with Exceptions

like image 219
Jaswanth Kumar Avatar asked Oct 16 '13 12:10

Jaswanth Kumar


People also ask

What C is used for?

C programming language is a machine-independent programming language that is mainly used to create many types of applications and operating systems such as Windows, and other complicated programs such as the Oracle database, Git, Python interpreter, and games and is considered a programming foundation in the process of ...

What is the full name of C?

In the real sense it has no meaning or full form. It was developed by Dennis Ritchie and Ken Thompson at AT&T bell Lab. First, they used to call it as B language then later they made some improvement into it and renamed it as C and its superscript as C++ which was invented by Dr. Stroustroupe.

Is C language easy?

C is a general-purpose language that most programmers learn before moving on to more complex languages. From Unix and Windows to Tic Tac Toe and Photoshop, several of the most commonly used applications today have been built on C. It is easy to learn because: A simple syntax with only 32 keywords.

How old is the letter C?

The letter c was applied by French orthographists in the 12th century to represent the sound ts in English, and this sound developed into the simpler sibilant s.


2 Answers

No there isn't as far as I know. But you could use very simple LINQ to do that in a single line.

var s1 = Directory.GetFiles(path , "*.*", SearchOption.AllDirectories).Where(d => !d.StartsWith("<EXCLUDE_DIR_PATH>")).ToArray();

You can easily combine multiple exclude DIRs too.

like image 103
dotNET Avatar answered Sep 26 '22 15:09

dotNET


You can't do exactly what you want with simple LINQ methods. You will need to write a recursive routine instead of using SearchOption.AllDirectories. The reason is that you want to filter directories not files.

You could use the following static method to achieve what you want:

public static IEnumerable<string> GetFiles(
    string rootDirectory,
    Func<string, bool> directoryFilter,
    string filePattern)
{
    foreach (string matchedFile in Directory.GetFiles(rootDirectory, filePattern, SearchOption.TopDirectoryOnly))
    {
        yield return matchedFile;
    }

    var matchedDirectories = Directory.GetDirectories(rootDirectory, "*.*", SearchOption.TopDirectoryOnly)
        .Where(directoryFilter);

    foreach (var dir in matchedDirectories)
    {
        foreach (var file in GetFiles(dir, directoryFilter, filePattern))
        {
            yield return file;
        }
    }
}

You would use it like this:

var files = GetFiles("C:\\SearchDirectory", d => !d.Contains("AvoidMe", StringComparison.OrdinalIgnoreCase), "*.*");

Why the added complexity? This method completely avoids looking inside directories you're not interested in. The SearchOption.AllDirectories will, as the name suggests, search within all directories.

If you're not familiar with iterator methods (the yield return syntax), this can be written differently: just ask!

Alternative

This has almost the same effect. However, it still finds files within subdirectories of the directories you want to ignore. Maybe that's OK for you; the code is easier to follow.

public static IEnumerable<string> GetFilesLinq(
    string root,
    Func<string, bool> directoryFilter,
    string filePattern)
{
    var directories = Directory.GetDirectories(root, "*.*", SearchOption.AllDirectories)
        .Where(directoryFilter);

    List<string> results = new List<string>();

    foreach (var d in directories)
    {
        results.AddRange(Directory.GetFiles(d, filePattern, SearchOption.TopDirectoryOnly));
    }

    return results;
}
like image 45
Olly Avatar answered Sep 24 '22 15:09

Olly