GetFileInfo 返回file从末端开始向前查找到的以flag开头到文件末尾的字节数组,和相对于文件中0位置的偏移量,以及err
// GetFileInfo 返回file从末端开始向前查找到的以flag开头到文件末尾的字节数组,和相对于文件中0位置的偏移量,以及err
func GetFileInfo(filePath, flag string) (infoBytes []byte, offset int64, err error) {
file, err0 := os.Open(filePath)
defer file.Close()
if err0 != nil {
return nil, -1, err0
}
flagLength := int64(len(flag))
if flagLength == 0 {
return nil, -1, errors.New("GetFileInfo: the length of the flag is zero")
}
fileInfo, err1 := file.Stat()
if err1 != nil {
return nil, -1, err1
}
bufferLength := int64(1024)
if bufferLength > fileInfo.Size() {
bufferLength = fileInfo.Size()
}
if bufferLength <= flagLength {
bufferLength = flagLength + 1
}
if fileInfo.Size() < flagLength {
return nil, -1, errors.New("GetFileInfo: the length of the flag is greater than the length of the file")
}
flagBytes := []byte(flag)
buffer := make([]byte, bufferLength)
for newOffset, seekErr := file.Seek(-bufferLength, 2); seekErr == nil; {
_, _ = file.Read(buffer)
oldOffset := newOffset
newOffset, seekErr = file.Seek(oldOffset-bufferLength+flagLength, 0)
if index := bytes.Index(buffer, flagBytes); index >= 0 {
infoBytes = make([]byte, fileInfo.Size()-(oldOffset+int64(index)))
offset = oldOffset + int64(index)
_, _ = file.Seek(offset, 0)
_, _ = file.Read(infoBytes)
return
}
}
return nil, -1, errors.New("GetFileInfo: not found: " + flag)
}