73 lines
1.7 KiB
Go
73 lines
1.7 KiB
Go
package firefly
|
|
|
|
import (
|
|
"fmt"
|
|
"io"
|
|
"os"
|
|
"path/filepath"
|
|
|
|
"golang.org/x/exp/mmap"
|
|
)
|
|
|
|
type ChunkInfo struct {
|
|
Name string
|
|
Offset int64
|
|
Size int64
|
|
}
|
|
|
|
func ProcessWithBufReader(path string, chunks []ChunkInfo) {
|
|
file, err := os.Open(path)
|
|
if err != nil {
|
|
fmt.Printf("Error opening file %s: %v\n", path, err)
|
|
return
|
|
}
|
|
defer file.Close()
|
|
|
|
for _, chunk := range chunks {
|
|
buffer, err := ReadChunkData(file, chunk.Offset, chunk.Size)
|
|
if err != nil {
|
|
fmt.Printf("Error reading chunk %s: %v\n", chunk.Name, err)
|
|
continue
|
|
}
|
|
|
|
assetPath := filepath.Join("chunk_tmp", chunk.Name)
|
|
parentDir := filepath.Dir(assetPath)
|
|
if _, err := os.Stat(parentDir); os.IsNotExist(err) {
|
|
if err := os.MkdirAll(parentDir, 0o755); err != nil {
|
|
fmt.Printf("Error creating directory %s: %v\n", parentDir, err)
|
|
continue
|
|
}
|
|
}
|
|
|
|
if err := os.WriteFile(assetPath, buffer, 0o644); err != nil {
|
|
fmt.Printf("Error writing chunk file %s: %v\n", assetPath, err)
|
|
}
|
|
}
|
|
}
|
|
|
|
func ReadChunkData(file *os.File, offset, size int64) ([]byte, error) {
|
|
info, err := file.Stat()
|
|
if err != nil {
|
|
return nil, fmt.Errorf("error getting file info: %w", err)
|
|
}
|
|
|
|
if info.Size() > 1024*1024 && size > 1024*1024 {
|
|
mmapReader, err := mmap.Open(file.Name())
|
|
if err == nil {
|
|
defer mmapReader.Close()
|
|
buffer := make([]byte, size)
|
|
_, err := mmapReader.ReadAt(buffer, offset)
|
|
if err != nil && err != io.EOF {
|
|
return nil, fmt.Errorf("error reading mmap: %w", err)
|
|
}
|
|
return buffer, nil
|
|
}
|
|
}
|
|
|
|
buffer := make([]byte, size)
|
|
_, err = file.ReadAt(buffer, offset)
|
|
if err != nil && err != io.EOF {
|
|
return nil, fmt.Errorf("error reading buffered: %w", err)
|
|
}
|
|
return buffer, nil
|
|
} |