2015-03-27 7 views
0

Я пытаюсь проверить номер версии некоторых EXE-файлов, которые у меня есть с VB.Net.Строка строки строки слишком короткая или слишком длинная

Это код, который я нашел в Интернете:

Public Class Form1 

    '\\ Pulls the file version out of the exe properties 
    Private Function GetFileVersionInfo(ByVal filename As String) As Version 
     Return Version.Parse(FileVersionInfo.GetVersionInfo(filename).ProductVersion) 
    End Function 

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 
     MessageBox.Show("Version: " + GetFileVersionInfo("C:\Users\jborg\SkyDrive Pro\Client Software\Malware Tools\HitmanPro.exe").ToString) 
    End Sub 
End Class 

код работает отлично, execept для EXE, перечисленных в коде.

Это дает мне следующую ошибку:

Error Message

В данном разделе приведены сведения о файлах между рабочим файлом, а не работает файл:

enter image description here

Есть ли что-то не так с EXE, почему я получаю эту ошибку? или есть лучший способ для меня распечатать номер версии файла?

+0

Какая фактическая строка в плохом? похоже, что у него есть пробелы или что-то встроенное. – Plutonix

+0

Фактическая строка должна быть «Версия продукта», однако, если я использую «Версию файла», которая не имеет пробелов, я получаю ту же ошибку. – level42

+0

Итак, каков статус этого? – Plutonix

ответ

0

Я не уверен, где вы находитесь в этой саге, но если Parse терпит неудачу на что-то, вы можете использовать TryParse по крайней мере, избежать исключения:

Dim str = FileVersionInfo.GetVersionInfo(fname).ProductVersion() 
If Version.TryParse(str, ver) = False Then 
    ... 
End If 

Вы также можете предоставить свой собственный парсер и значение по умолчанию для любой части, которая является недействительной, отсутствует или в противном случае мог бы оскорбить:

Dim ver As New Version() 
If Version.TryParse(str, ver) = False Then 

    Dim parts = str.Split("."c) 
    ver = New Version(
     If(parts.Length >= 1, ValueOrDefault(parts(0)), 0), 
     If(parts.Length >= 2, ValueOrDefault(parts(1)), 0), 
     If(parts.Length >= 3, ValueOrDefault(parts(2)), 0), 
     If(parts.Length >= 4, ValueOrDefault(parts(3)), 0) 
     ) 
End If 

' a helper function to 
' get the int value of a string or 0 if "too long or too short" 
Private Function ValueOrDefault(str As String) As Integer 
    Dim n As Integer 

    If Int32.TryParse(str, n) Then 
     ' trap for values < 0 
     Return If(n < 0, 0, n) 
     ' or: Return If(n < 0, 0 - n, n) 
    Else 
     Return 0 
    End If 

End Function 

Учитывая строку с слишком большим сегментом: vstr = "1.435973459374957394.6.7.8", результат "1.0.6.7". Второе негативное значение пропускается и используется значение по умолчанию 0.

Для "1" результат: "1.0.0.0", а также для "Hello, World!" или любой другой нечисловой или пустой строки, результатом является 0.0.0.0.

Смежные вопросы