【问题标题】:find files then parse the results before displaying the results查找文件然后在显示结果之前解析结果
【发布时间】:2017-07-12 10:11:00
【问题描述】:

我正在为我们的客户服务部门开发一款应用。用户将输入打印编号和制造日期。然后,该应用程序将执行获取文件,返回使用该图号(多个修订版)找到的所有文件的结果。这些文件以这种格式命名drawingnumber_rev_pages_6-digit date.pdf。 一旦我得到了该图纸编号的列表,然后我取一个 10 个字符的右(字符串)来去除 6 位数的日期,并执行 Date.ParseExact 以与用户输入的制造日期进行比较。我在那个日期之前抓取了任何东西,并将它们显示在一个列表框中。标准现在已经改变,他们希望我只显示与该构建日期相关的文件。问题是,我需要该日期之前的第一个版本。而且我不完全理解我的 getfiles 语句的 (function) 部分。所以我不知道要搜索什么来查找谷歌结果。当我搜索getfiles时,没有提到函数,如果我查找orderby ...函数没有提到,我需要在linq下搜索吗?你会建议我如何处理这个? original version example 新版本,我可以过滤结果并找到日期之前的所有内容......但我想要的是制造之前的最高版本。日期。返回单个结果。 current version

谢谢大家-这是我的示例代码。

Try
    Dim results = Directory.GetFiles(fp, f).
        OrderByDescending(Function(x) New FileInfo(x).FullName)

    For Each result In results
        Dim dp As String = ""
        Dim d As Date
        dp = Strings.Right(result, 10)
        dp = Strings.Left(dp, 6)
        d = Date.ParseExact(dp, "MMddyy", New Globalization.CultureInfo("en-us"))
        Debug.Print(dp)
        Debug.Print(d)
        Dim udt As String = ""
        Dim ud As Date 'user date
        udt = Trim(Replace(txtMfgDate.Text, "/", ""))
        If udt.ToString.Length = 0 Then lstFound.Items.Add(result)

        ud = Date.ParseExact(udt, "MMddyy", New Globalization.CultureInfo("en-us"))
        If d.Date <= ud.Date Then
            lstFound.Items.Add(result)
        End If

        Debug.Print(d)
        Debug.Print(ud)
        If result <> Nothing Then

        End If
    Next
Catch x As Exception
    MessageBox.Show("Error finding file: " & f)
End Try

【问题讨论】:

  • OrderByDescending 没有意义,因为您可以直接使用文件路径,所以:Directory.GetFiles(fp, f).OrderByDescending(Function(path) path)。如果不能使用 LINQ,则需要 .NET 3.5、Vuisual Studio 2008 和Imports System.Linq
  • 我正在使用 .net 4.5.2 并使用 Visual Studio 2015 编写代码。我是自学的,并使用语句的函数部分找到了 getfiles 示例 - 我曾经使用它获取最后修改日期,但这并不反映实际的修改日期 - 所以我不得不修改它。我提到了 linQ,因为我不确定函数部分是否是 linq 语句。我无法在我的代码中找到有关 getfiles 行那部分的文档 - 我不完全理解它是如何工作的。
  • orderby 在那里我在其他代码区域中使用它,在那里我找到了第一个获取最新版本的实例。生产和账单编写者也使用这个应用程序。我的复制/粘贴习惯不好。
  • 错误信息到底是什么?还显示堆栈跟踪(其中提到了行号和方法)。
  • 没有错误。让我改述一下。我正在寻找这样的文件。用户输入绘图号 0.071.911 当前应用程序返回所有修订。 0071911_a_1_072115.pdf、0071911_b_1_091115.pdf等客服有保修或电话,他们想输入日期作为搜索条件的一部分。客户单位制造日期为 2015 年 7 月 1 日。然后我想找到并只显示版本 A,因为版本 b 是在客户版本之后制作的。如果日期是 2017 年 6 月 1 日 - 在这种情况下它将返回 rev F,而不是 rev a thru F...我的第一次尝试我只返回日期之前的那些,但他们想要 1 个文件。

标签: vb.net linq getfiles


【解决方案1】:

LINQ 可以在适当的条件下完成您需要的一切。我还尝试以其他方式清理一些代码。我将 LINQ 表达式切换为查询理解,以便可以使用 Let

Try
    Dim enusCulture = New Globalization.CultureInfo("en-us") ' consider CultureInfo.CurrentCulture instead?
    Dim udt As String = Trim(Replace(txtMfgDate.Text, "/", ""))
    Dim ud As Date

    If udt.Length > 0 Then ud = Date.ParseExact(udt, "MMddyy", enusCulture) ' user mfg date
    ' 0071911_a_1_072115.pdf

    Dim results = From filename In Directory.GetFiles(fp, f)
        Let filedate = Date.ParseExact(filename.Substring(filename.Length - 10, 6), "MMddyy", enusCulture)
        Where udt.Length = 0 OrElse filedate.Date < ud.Date
        Order By filedate Descending

    If udt.Length> 0 Then
        results = results.Take(1)
    End If

    lstFound.Items.AddRange(results)
Catch x As Exception
    MessageBox.Show("Error finding file: " & f)
End Try

Function(x) 语法是一个 lambda 表达式,它是OrderByDescending 函数的 LINQ 方法语法的一部分,如果您想研究的话。

【讨论】:

  • 感谢您的回复 - 并解释这是一个 lambda 表达式,我会搜索并阅读它。与此同时 - 我会尝试你的代码修改。给予信任-谢谢-
  • 上面的代码解决方案不起作用,没有找到任何文件。错误与日期不是日历格式有关吗?我以前从未见过的东西。
  • 我认为逻辑有误。让我解决它。
  • 我想我在ud 分配中有错字。否则,只有当文件名的格式错误时才会出现该错误。
猜你喜欢
  • 2012-11-03
  • 1970-01-01
  • 2018-09-20
  • 1970-01-01
  • 1970-01-01
  • 2012-04-05
  • 1970-01-01
  • 2019-07-09
  • 2016-08-15
相关资源
最近更新 更多