add collecting of filemetadata for a given source
This commit is contained in:
86
source/source.go
Normal file
86
source/source.go
Normal file
@ -0,0 +1,86 @@
|
||||
package source
|
||||
|
||||
import (
|
||||
"crypto/sha256"
|
||||
"fmt"
|
||||
"forever-files/db"
|
||||
"forever-files/types"
|
||||
"io"
|
||||
"log"
|
||||
"os"
|
||||
"path"
|
||||
)
|
||||
|
||||
// the purpose of this package is to gather information about the source files for the backup
|
||||
// it will store the information in a database
|
||||
// information to gather:
|
||||
// - file name
|
||||
// - file path
|
||||
// - file size
|
||||
// - file hash
|
||||
// - modified date
|
||||
|
||||
func GatherInfo(path string, db db.DB) {
|
||||
err := walkDir(path, db)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
}
|
||||
|
||||
func walkDir(dirPath string, db db.DB) error {
|
||||
// get list of files in directory
|
||||
directoryEntries, err := os.ReadDir(dirPath)
|
||||
if err != nil {
|
||||
return fmt.Errorf("error reading directory: %w", err)
|
||||
}
|
||||
for _, entry := range directoryEntries {
|
||||
if entry.IsDir() {
|
||||
err = walkDir(path.Join(dirPath, entry.Name()), db)
|
||||
if err != nil {
|
||||
return fmt.Errorf("error walking directory: %w", err)
|
||||
}
|
||||
} else {
|
||||
// gather info
|
||||
fileInfo, err := entry.Info()
|
||||
if err != nil {
|
||||
log.Default().Printf("error getting file info: %v", err)
|
||||
continue
|
||||
}
|
||||
hash, err := hashFile(path.Join(dirPath, entry.Name()))
|
||||
if err != nil {
|
||||
log.Default().Printf("error hashing file: %v", err)
|
||||
continue
|
||||
}
|
||||
// store info
|
||||
fmt.Printf("Name: %v, Size: %v, Modified Date: %v, Hash: %v\n", fileInfo.Name(), fileInfo.Size(), fileInfo.ModTime(), hash)
|
||||
err = db.StoreFile(types.FileMetadata{
|
||||
Name: fileInfo.Name(),
|
||||
Path: dirPath,
|
||||
Size: fileInfo.Size(),
|
||||
Hash: hash,
|
||||
ModifiedDate: fileInfo.ModTime(),
|
||||
BackedUp: false,
|
||||
})
|
||||
if err != nil {
|
||||
log.Default().Printf("error storing file metadata: %v", err)
|
||||
continue
|
||||
}
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func hashFile(filePath string) ([]byte, error) {
|
||||
file, err := os.Open(filePath)
|
||||
if err != nil {
|
||||
return []byte{}, fmt.Errorf("error opening file for hashing: %w", err)
|
||||
}
|
||||
defer file.Close()
|
||||
|
||||
h := sha256.New()
|
||||
if _, err := io.Copy(h, file); err != nil {
|
||||
return []byte{}, fmt.Errorf("error hashing file: %w", err)
|
||||
}
|
||||
|
||||
return h.Sum(nil), nil
|
||||
}
|
Reference in New Issue
Block a user