【问题标题】:substring doesn't match string子字符串与字符串不匹配
【发布时间】:2019-09-05 21:42:56
【问题描述】:

我有以下函数,当它打开文件以建立文件类型时,它不会返回正确的值。我做错了什么?

前 8 个字符采用这种格式 %PDF-1.4

Function GetFileType(xFile As String) As Boolean
    Dim fileBytes As Byte()

    fileBytes = System.IO.File.ReadAllBytes(xFile)

    Dim s As String
    s = System.Text.Encoding.UTF8.GetString(fileBytes)

    Select Case s
        Case s.Substring(1, 3) = "PDF"
            GetFileType = False
        Case Else
            GetFileType = True
    End Select

End Function

它与 case 语句不匹配,它总是移动到让我难过的 else 部分。

【问题讨论】:

  • 使用调试器并查看值。
  • 我用过调试器,值看起来正确!
  • Select Case s.Substring(1, 3)Case "PDF"
  • VB.NET 实际上并不支持这种 Case 语句语法。 Option Strict On 允许编译器告诉你它。请考虑一个简单的 If 语句。
  • 对于文件签名检测,最好进行逐字节比较。除了更可靠(转换为 UTF-8 可能会导致您不关心的无效字符)之外,您不必读取整个文件来确定这 8 个字节是否与签名匹配。打开一个FileStream,最多读取8个字节,然后比较(与签名的ASCII字符作为字节值的字符)。

标签: vb.net


【解决方案1】:

你为什么要使用 case 语句?

在这种情况下(看看我在那里做了什么?),一个简单的If 就可以了:

Function GetFileType(xFile As String) As Boolean
    Dim fileBytes As Byte()

    fileBytes = System.IO.File.ReadAllBytes(xFile)

    Dim s As String
    s = System.Text.Encoding.UTF8.GetString(fileBytes)

    if s.Substring(1, 3) = "PDF" then
            GetFileType = False
    Else
            GetFileType = True
    End If

End Function

【讨论】:

  • 或者只是 GetFileType = s.SubString(1, 3) "PDF".
  • @HansPassant,非常棒!但我仍然建议使用简单的If Then Else,因为它提供了一种更通用的方法,适用于比这种特殊情况更多的情况。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-12
  • 2011-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-03
  • 2021-08-25
相关资源
最近更新 更多