在多个条件上过滤GetFiles()

时间:2014-12-14 23:59:19

标签: vb.net directoryinfo

不确定如何说出我的问题标题。但希望这会很快。

我在文件夹中有一堆PDF文件,我想获取某个类型文件的最近修改或创建日期。我的代码有效,但它给了我所有PDF文件的结果。我只想要某些名字的结果。

例如。在我的" c:\ temp \"我有一些PDF文件,它们以大约相同的3个首字母开头,后跟数字或更多字母。

文件名,如tes8796,fes8897895,bas232。等等我只想显示" fes"和" bas"文件,我不想看到" tes"文件...

有什么想法吗?

我认为它应该看起来像这样{" fes * .pdf"," Bas * .pdf"})

我的代码有效,(我只希望获得#34; fes"以及" bas" fils的结果。)

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

3 个答案:

答案 0 :(得分:0)

您正在调用的GetFiles方法已超载,并允许您指定要匹配的单个模式。您可以调用该方法两次(每个模式一次),然后组合结果,否则您可以按原样检索所有文件,然后在Where调用中添加另一个条件,将ny名称过滤为以及日期/时间。

答案 1 :(得分: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

答案 2 :(得分: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来避免循环。所以,要解决这两个问题:

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中的var名称,如DirectoryFile等类型。第二个函数过滤了names数组,然后将结果直接抽入到listbox items集合中。

几乎在所有情况下,普通循环都会更快:

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倍(取决于文件和名称过滤器的数量) a
  • 将使用不同的文件名过滤器
  • 将查找/过滤操作与发布相结合,以消除额外的循环(Console.WriteLine可以添加到项目或根据需要添加到列表。)

a 时间差是否重要取决于它的使用方式和负载。如果它连续运行以处理许多文件,那么它可能很重要。作为桌面应用程序的一部分,可能不是。