func()

in pkg/lockedfile/lockedfile_windows.go [76:112]


func (self *lockedFile) ReadLockedFile() ([]byte, error) {
	// make an empty byte slice with 4KB default size
	fileBytes := make([]byte, 0, 4096)
	buffer := make([]byte, 4096, 4096)

	ol, err := getOverlapped()
	if err != nil {
		return nil, err
	}
	defer windows.Close(ol.HEvent)
	for {
		err := windows.ReadFile(self.fileHandle, buffer, nil, ol)
		if err != nil && err != syscall.ERROR_IO_PENDING {
			return nil, err
		}
		var readBytes uint32
		err = windows.GetOverlappedResult(self.fileHandle, ol, &readBytes, true)
		if err != nil {
			if err == windows.ERROR_HANDLE_EOF {
				break
			}
			return nil, err
		}

		fileBytes = append(fileBytes, buffer[:readBytes]...)

		// modify ol to read next bytes
		longOffset := combineTwoUint32ToUlong(ol.OffsetHigh, ol.Offset)
		longOffset += uint64(readBytes)
		ol.OffsetHigh, ol.Offset = splitUlongToTwoUint32(longOffset)
		err = windows.ResetEvent(ol.HEvent)
		if err != nil {
			return nil, err
		}
	}
	return fileBytes, nil
}