2014-12-14 2 views
0

Не знаю, как сформулировать заголовок моего вопроса. но, надеюсь, это будет быстро.Фильтр GetFiles() по нескольким критериям

У меня есть куча PDF-файлов в папке, я хочу получить недавнюю измененную или созданную дату определенного типа файла. Мой код работает, но он дает мне результаты всех файлов PDF. Мне нужны только результаты определенных имен.

Например. в моем "c: \ temp \" У меня есть файлы PDF, которые начинаются примерно с тех же 3 первых букв, за которыми следуют цифры или больше букв.

Имена файлов, такие как tes8796, fes8897895, bas232. и т. д. Я хочу только показать результаты файлов «fes» и «bas», я не хочу видеть файлы «tes» ...

Любые идеи?

Я считаю, что это должно выглядеть примерно так: { «фес * .pdf», «Bas * .pdf»})

Мой код, который работает, (я только хочу, чтобы получить результат только «ФЕС» и «BAS» филсов.)

Dim pathx As String = "C:\temp\" 
Dim directory = New DirectoryInfo(pathx) 
Dim from_date As DateTime = DateTime.Now.AddHours(-24) 
Dim to_date As DateTime = DateTime.Now 
Dim files = directory.GetFiles().Where(Function(file) file.LastWriteTime >= from_date AndAlso file.LastWriteTime <= to_date) 
For Each filx In files 
    ListBox1.Items.Add(filx) 
Next 

ответ

0

Существует несколько способов сделать это. Во-первых, вы можете применить фильтр PDF в начале: directory.GetFiles("*.pdf"), то просто расширить свои условия функции:

Dim names() As String = {"fes", "bas"} 

Dim files = di.GetFiles("*.pdf").Where(
     Function(file) (file.LastWriteTime >= from_date _ 
       AndAlso file.LastWriteTime <= DateTime.Now) _ 
        AndAlso (names.Contains(file.Name.ToLowerInvariant.Substring(0, 3))) 
      ) 

For Each filx In files 
    Console.WriteLine(filx) 
Next 

Проблема заключается в том, что это зависит от файла, начиная имена всегда и навсегда 3 символов. Кроме того, посмотрите на свой код: как только вы получите свой массив, вы перебираете его, чтобы отправить его в ListBox. Обычно классные дети используют LINQ to избегают петель. Таким образом, чтобы исправить обе проблемы:

ListBox1.Items.AddRange(di.GetFiles("*.pdf").Where(
     Function(f) (f.LastWriteTime >= from_date AndAlso f.LastWriteTime <= DateTime.Now) _ 
      AndAlso names.Any(Function(n) f.Name.ToLowerInvariant.StartsWith(n)) 
      ).ToArray) 

Я избавилась от имен вар, которые уже существуют в NET как типы, такие как Directory и File. Вторая функция фильтрует массив имен, затем результаты накачиваются непосредственно в коллекцию элементов списка.

Почти во всех случаях, простой цикл будет быстрее:

Dim myfiles = directory.GetFiles("*.pdf") 
For Each f In myfiles 
    If f.LastAccessTime >= from_date AndAlso f.LastWriteTime <= DateTime.Now Then 
     For Each s As String In names 
      If f.Name.ToLowerInvariant.StartsWith(s.ToLowerInvariant) Then 
       Console.WriteLine(f) 
       Exit For      ' abort when found 
      End If 
     Next 
    End If 
Next 
  • , вероятно, более понятным для себя провозгласил новичку в VB.NET
  • это может быть постепенно отлажена
  • она составляет от 2 до 100 раз быстрее, в процессе (в зависимости количества файлов и имен фильтров)
  • будет работать с другим именем файла фильтры
  • сочетает в себе Диагностика/операция фильтрации с проводкой, чтобы исключить дополнительную петлю (Console.WriteLine может добавить к пунктам или добавить в список по мере необходимости.)

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

+0

Большое спасибо. Я получил свой код для работы. спасибо – TuckingFypo

0

GetFiles метод, который вы звоните, перегружен и позволяет указать один шаблон, чтобы соответствовать. Вы можете вызвать этот метод дважды (один раз для каждого шаблона), а затем объединить результаты, иначе вы сможете получить все файлы с помощью одного вызова, как вы, а затем добавить еще одно условие для вашего вызова Where для фильтрации имени ny, а также даты/время.

+0

Я понял, как много, но я немного новичок, когда речь заходит о VB. так что, возможно, вы можете ПОЖАЛУЙСТА, отредактируйте, что мне нужно, чтобы получить результаты, что я хочу? Кроме того, имена файлов будут не только двумя. Спасибо – TuckingFypo

0

Вы были очень близки. Я бы сделал что-то вроде этого:

Dim pathx As String = "C:\temp\" 
    Dim directory = New IO.DirectoryInfo(pathx) 
    Dim from_date As DateTime = DateTime.Now.AddHours(-24) 
    Dim to_date As DateTime = DateTime.Now 
    Dim files = directory.GetFiles().Where(Function(file) file.LastWriteTime >= from_date AndAlso file.LastWriteTime <= to_date AndAlso file.Name.EndsWith(".pdf") AndAlso (file.Name.StartsWith("fes") OrElse file.Name.StartsWith("bas"))) 
    For Each filx In files 
     ListBox1.Items.Add(filx) 
    Next 
Смежные вопросы