【问题标题】:How can I check if filename contains a portion of a string in vb.net如何检查文件名是否包含 vb.net 中字符串的一部分
【发布时间】:2012-06-27 15:31:53
【问题描述】:

我有一个 2008 vb express edition 的用户表单。零件号是通过连接字符串从用户输入创建的。然后我想检查目录中现有文件名中是否存在零件号的某个部分。下面是更详细的解释。

这是我从表单上的用户输入创建零件号的代码。

L_PartNo.Text = String.Concat(CB_Type.Text, CB_Face.Text, "(", T_Width.Text, "x", T_Height.Text, ")", mount, T_Qty.Text, weep, serv)

然后我有以下代码告诉用户他们刚刚创建的配置(部件号)是否存在

L_Found.Visible = True
If File.Exists("Z:\Cut Sheets\TCS Products\BLANK OUT SIGN\" & (L_PartNo.Text) & ".pdf") Then
        L_Found.Text = "This configuration exists"
      Else
        L_Found.Text = "This configuration does NOT exist"
      End If

这是我需要帮助的地方。零件号看起来像这样 BX002(30x30)A1SS 我想将 002(30x30)(只是文件名的这一部分)与一个目录中的所有文件进行比较。我想要一个存在或否的答案,而不是所有匹配文件的列表。下面的代码是我尝试过的所有内容,而不是同时尝试。

Dim b As Boolean
b = L_PartNo.Text.Contains(NewFace)

Dim NewFace As String = String.Concat(CB_Face.Text, "(", T_Width.Text, "x", T_Height.Text, ")")
Dim NewFace = L_PartNo.Text.Substring(2, 10)

If filename.Contains(NewFace) Then
        lNewFace.Visible = False
      Else
        lNewFace.Visible = True
      End If

下面的代码是 C# 中答案的翻译,但它也不起作用

Dim contains As Boolean = Directory.EnumerateFiles(path).Any(Function(f) [String].Equals(f, "myfilethree", StringComparison.OrdinalIgnoreCase))

【问题讨论】:

    标签: vb.net string filenames


    【解决方案1】:

    这是一个示例,说明如何在没有花哨的 LINQ 和 Lambda 的情况下做到这一点,这似乎让您感到困惑:

    Public Function FileMatches(folderPath As String, filePattern As String, phrase As String) As Boolean
        For Each fileName As String In Directory.GetFiles(folderPath, filePattern)
            If fileName.Contains(phrase) Then
                Return True
            End If
        Next
        Return False
    End Function
    

    或者,如果您需要不区分大小写:

    Public Function FileMatches(folderPath As String, filePattern As String, phrase As String) As Boolean
        For Each fileName As String In Directory.GetFiles(folderPath, filePattern)
            If fileName.ToLower().Contains(phrase.ToLower()) Then
                Return True
            End If
        Next
        Return False
    End Function
    

    你可以这样调用方法:

    lNewFace.Visible = FileMatches(path, "*.pdf", NewFace)
    

    【讨论】:

    • 我收到以下错误“EnumerateFiles 不是 System.IO.Directory 的成员”。我用谷歌搜索,发现这不适用于visual basic 2008 express edition net framework 3.5。这是正确的吗?我可以升级到 net framework 4.0 吗?
    • @UBel 我更新了示例以展示如何在没有更新版本的框架的情况下做同样的事情。
    • 我做了一些修改并添加了一个出口,这对我有用,谢谢。
    【解决方案2】:

    试试这个:

     lNewFace.Visible = IO.Directory.GetFiles(path, "*.pdf").Where(Function(file) file. _
                Substring(2, 10) = NewFace).FirstOrDefault Is Nothing
    

    考虑如果子字符串函数的参数超过它正在解析的字符串的长度,它会抛出异常

    【讨论】:

    • 这使得 lNewFace 在任何条件匹配或不匹配下都是可见的。我之前尝试过的一些代码会产生相同的效果。我对编码的理解不够好,无法修改。我将cd路径替换为文件的路径。我需要改变什么吗?也许在“Where(Function(file)文件”中,“FirstOrDefault Is Nothing”是什么意思?同时我会谷歌。
    • 表示“返回第一个结果或Nothing”;简而言之,如果没有找到匹配项,equals 右侧的语句将返回 true。很难相信它(错误地)总是使标签可见,而不管 NewFace 的值如何。设置一些断点并检查变量的值(路径、NewFace 等) - 您确定生成的文件路径存在吗?
    • 感谢您的解释。我从 SteveDog 调整了代码并得到了我需要的东西。再次感谢。
    猜你喜欢
    • 1970-01-01
    • 2011-09-19
    • 2022-06-14
    • 2012-01-14
    • 2015-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-05
    相关资源
    最近更新 更多