Запрос информации о файловой системе динамически с использованием LINQ - PullRequest
3 голосов
/ 08 июля 2010

Мне нужно иметь возможность вернуть список файлов, которые соответствуют некоторым динамическим критериям. Я пытался сделать это с помощью LINQ.

Я обнаружил, что можно использовать динамический LINQ, используя пространство имен System.Linq.Dynamic, упомянутое в Блоге Скотта Гу .

Но я не уверен, что можно использовать для того, для чего он мне нужен.

Пока я получаю все файлы, но я не уверен, куда идти.

// Take a snapshot of the file system.
System.IO.DirectoryInfo dir = new System.IO.DirectoryInfo(SourceLocation);

// This method assumes that the application has discovery permissions
// for all folders under the specified path.
IEnumerable<System.IO.FileInfo> fileList = dir.GetFiles("*.*", System.IO.SearchOption.AllDirectories);

Теперь мне нужно отфильтровать эти файлы, используя некоторые динамические фильтры, созданные пользователем. например Расширение = .txt

Кто-нибудь может указать мне правильное направление?

Спасибо. Мартин.

РЕДАКТИРОВАТЬ:

Пример из библиотеки Dynamic Linq выглядит следующим образом:

var query =
            db.Customers.Where("City == @0 and Orders.Count >= @1", "London", 10).
            OrderBy("CompanyName").
            Select("New(CompanyName as Name, Phone)");

Я надеялся адаптировать это для файловой системы. Поэтому я могу просто создать строку фильтра и использовать ее.

Ответы [ 3 ]

3 голосов
/ 12 июля 2010

Это метод, который я использовал.

var diSource = new DirectoryInfo(SourceLocation);            
var files = GetFilesRecursive(diSource);
var matches = files.AsQueryable().Where(sFilter, oParams);

SourceLocation - это просто путь к файлу в каталоге, который я хочу найти. GetFileRecursive - это просто пользовательский метод для возврата всех файлов в дочерних папках.

Я строю параметр sFilter на основе фильтров, определенных моими пользователями, а oParams - это массив значений для этих фильтров. Это позволяет моим пользователям динамически определять столько фильтров, сколько им требуется.

2 голосов
/ 08 июля 2010
var files = fileList.Where(
    f => f.Modified > DateAdd(DateInterval.Days, -1, DateTime.Now);

или

var files = fileList.Where(f => f.Name.EndsWith(".txt"));

или

var files = fileList.Where(f => f.IsReadOnly);

Это LINQ.В части f => f. вы можете поместить любое выражение, которое оценивается, в логическое значение.Небо это предел.Вы можете написать функцию, которая принимает объект FileInfo, читает текст файла и возвращает true, если он содержит определенную фразу.Тогда вы просто сделаете это ...

var files = fileList.Where(f => MyFunction(f));

К вашей точке зрения по поводу фильтров, созданных пользователем, вам действительно нужно будет разработать пользовательский интерфейс и серверную часть, подходящие для возможных ситуаций.

0 голосов
/ 29 марта 2016

Если вы не используете свойства fileinfo как часть своей фильтрации, вы можете просто использовать следующее:

IEnumerable<System.IO.FileInfo> fileList = dir.GetFiles(**"*.txt"**,
 System.IO.SearchOption.AllDirectories);
...