Moin garry,
danke für den Hinweis. Ich habe das übersehen. Ich gehe mal davon aus, dass die gesuchte Versionsnummer in diesem Fall die
V1.3333 ist. Die ist hinter
ER-411/A421V abgetrennt durch ein NULL Byte als eigener String abgelegt.
Die von der Funktion zurückgelieferte Postion ist für diesen Fall recht nutzlos. Sie sagt ja nur aus, wo der String
ER-411 gefunden wurde. Der eingelesene Dateiinhalt steht aber nicht mehr zur Verfügung. Ich würde die Funktion deshalb 'spezialisieren':
Code: Select all
#NoEnv
SetBatchLines, -1
FilePath := "D:\ALL.SDA"
TypeStr := "ER-A411"
If (Version := Find_SDA_Version(FilePath, TypeStr))
MsgBox, 0, Version, Die Datei %FilePath% des Typs %TypeStr% hat die Version %Version%!
Else
MsgBox, 0, Version, Die Version der Datei %FilePath% konnte nicht ermittelt werden.
ExitApp
Find_SDA_Version(FilePath, TypeStr, Encoding := "CP0") {
FileGetSize, FileSize, %FilePath%
FileRead, FileContent, *c %FilePath%
Length := StrLen(TypeStr)
FirstChar := Asc(SubStr(TypeStr, 1, 1))
Offset := 0
MaxOffset := FileSize - Length
Version := ""
While (Offset < MaxOffset) {
If (NumGet(FileContent, Offset, "UChar") = FirstChar) && (StrGet(&FileContent + Offset, Length, Encoding) == TypeStr) {
While (NumGet(FileContent, Offset, "UChar") <> 0)
Offset++
Found := Trim(StrGet(&FileContent + Offset + 1, Encoding))
Break
}
Offset++
}
VarSetCapacity(FileContent, 0)
Return Found
}
In leicht abgewandelter Form kann man das auch nutzen, um einen String in einer vorgegebenen Länge ab der Trefferposition zurückzugeben. Wenn man allerdings anschließend mit der Datei noch mehr anstellen will, wäre eine
File Object Variante besser.