Update progress bar and more embed
This commit is contained in:
@@ -1,15 +1,15 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"ldiff-converter/pb"
|
||||
"fmt"
|
||||
"io"
|
||||
"ldiff-converter/pb"
|
||||
"os"
|
||||
"path/filepath"
|
||||
|
||||
"golang.org/x/exp/mmap"
|
||||
)
|
||||
|
||||
|
||||
func LDiffFile(data *pb.AssetManifest, assetName string, assetSize int64, ldiffsDir, outputDir string) error {
|
||||
path := filepath.Join(ldiffsDir, data.ChunkFileName)
|
||||
|
||||
@@ -17,15 +17,25 @@ func LDiffFile(data *pb.AssetManifest, assetName string, assetSize int64, ldiffs
|
||||
if err != nil {
|
||||
return fmt.Errorf("%s does not exist: %w", path, err)
|
||||
}
|
||||
|
||||
fileSize := info.Size()
|
||||
|
||||
var buffer []byte
|
||||
|
||||
if fileSize > 10*1024*1024 && data.HdiffFileSize > 1*1024*1024 {
|
||||
// mmap for large files using x/exp/mmap
|
||||
// ưu tiên mmap cho file lớn
|
||||
reader, err := mmap.Open(path)
|
||||
if err != nil {
|
||||
// fallback to buffered read
|
||||
if err == nil {
|
||||
defer reader.Close()
|
||||
buffer = make([]byte, data.HdiffFileSize)
|
||||
n, err := reader.ReadAt(buffer, data.HdiffFileInChunkOffset)
|
||||
if err != nil && err != io.EOF {
|
||||
return fmt.Errorf("error reading mmap data: %w", err)
|
||||
}
|
||||
if int64(n) < data.HdiffFileSize {
|
||||
return fmt.Errorf("expected %d bytes, but read %d bytes", data.HdiffFileSize, n)
|
||||
}
|
||||
} else {
|
||||
// fallback sang buffered read
|
||||
file, err := os.Open(path)
|
||||
if err != nil {
|
||||
return fmt.Errorf("error opening file %s: %w", path, err)
|
||||
@@ -35,22 +45,14 @@ func LDiffFile(data *pb.AssetManifest, assetName string, assetSize int64, ldiffs
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
} else {
|
||||
defer reader.Close()
|
||||
buffer = make([]byte, data.HdiffFileSize)
|
||||
_, err := reader.ReadAt(buffer, data.HdiffFileInChunkOffset)
|
||||
if err != nil {
|
||||
return fmt.Errorf("error reading mmap data: %w", err)
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// small files, buffered read
|
||||
// file nhỏ, dùng buffered read
|
||||
file, err := os.Open(path)
|
||||
if err != nil {
|
||||
return fmt.Errorf("error opening file %s: %w", path, err)
|
||||
}
|
||||
defer file.Close()
|
||||
|
||||
buffer, err = ReadBuffer(file, data.HdiffFileInChunkOffset, data.HdiffFileSize)
|
||||
if err != nil {
|
||||
return err
|
||||
@@ -58,7 +60,7 @@ func LDiffFile(data *pb.AssetManifest, assetName string, assetSize int64, ldiffs
|
||||
}
|
||||
|
||||
extension := ""
|
||||
if data.OriginalFileSize != 0 || assetSize != data.HdiffFileSize {
|
||||
if data.OriginalFileSize > 0 && assetSize != data.HdiffFileSize {
|
||||
extension = ".hdiff"
|
||||
}
|
||||
assetPath := filepath.Join(outputDir, assetName+extension)
|
||||
@@ -76,19 +78,16 @@ func LDiffFile(data *pb.AssetManifest, assetName string, assetSize int64, ldiffs
|
||||
return nil
|
||||
}
|
||||
|
||||
|
||||
|
||||
func ReadBuffer(file *os.File, offset int64, size int64) ([]byte, error) {
|
||||
buffer := make([]byte, size)
|
||||
|
||||
n, err := file.ReadAt(buffer, offset)
|
||||
if err != nil {
|
||||
if err != nil && err != io.EOF {
|
||||
return nil, fmt.Errorf("error reading data: %w", err)
|
||||
}
|
||||
if int64(n) != size {
|
||||
if int64(n) < size {
|
||||
return nil, fmt.Errorf("expected %d bytes, but read %d bytes", size, n)
|
||||
}
|
||||
|
||||
return buffer, nil
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user