Browse Source

文件数据库初始化

master
453530270@qq.com 2 years ago
parent
commit
59181bd076
  1. 8
      fstool/build.bat
  2. 9
      fstool/db/dbconst.go
  3. 97
      fstool/db/sqliteDb.go
  4. 5
      fstool/go.mod
  5. 2
      fstool/go.sum
  6. 57
      fstool/main.go
  7. 0
      fstool/ups.db
  8. 59
      fstool/util/fsutil.go

8
fstool/build.bat

@ -0,0 +1,8 @@
@echo off
title 文件HASH登记数据库FOR LINUX
color 16
set GOOS=linux
set GOARCH=amd64
set CGO_ENABLED=0
go build -o fshash main.go

9
fstool/db/dbconst.go

@ -0,0 +1,9 @@
package db
// 定义数据库中用的模型
type StFileInfo struct {
Id string `json:"id"`
Fpath string `json:"fpath"`
Fhash string `json:"fhash"`
Fname string `json:"fname"`
}

97
fstool/db/sqliteDb.go

@ -0,0 +1,97 @@
package db
import (
"database/sql"
"fmt"
// 导入包,导入前缀为下划线,则init函数被执行,然后注册驱动。
_ "github.com/mattn/go-sqlite3"
)
var db *sql.DB
var err error
func init() {
fmt.Printf("hey,I am initilize function in SqliteDb\n")
//
// Open() 函数指定驱动名称和数据源名称
db, err = sql.Open("sqlite3", "ups.db")
if err != nil {
fmt.Printf("Database creation failed: %v\n", err)
return
}
// 调用db.Close() 函数,确保关闭数据库并阻止启动新的查询
defer db.Close()
//
connectDB()
}
// 连接数据库
func ConnectDB() {
var version string
// QueryRow() 执行查询,返回版本号
err = db.QueryRow("SELECT SQLITE_VERSION()").Scan(&version)
if err != nil {
fmt.Printf("Database creation failed: %v\n", err)
return
}
// 连接成功,打印出"database connected:版本号"
fmt.Printf("Database creation successful: %v\n", version)
}
// 创建数据库表
func createTable() {
// 建表语句
sts := `
CREATE TABLE f_info (
id INTEGER PRIMARY KEY NOT NULL,
fname TEXT NOT NULL,
fpath TEXT NOT NULL,
fhash TEXT NOT NULL
);`
// 使用db.Exec() 函数来执行 SQL 语句
_, err = db.Exec(sts)
if err != nil {
fmt.Printf("Failed to create database table: %v\n", err)
return
}
fmt.Printf("Successfully created database table! \n")
}
// 插入数据
func InsertStf(sf StFileInfo) {
// 插入语句
res, err := db.Exec("INSERT INTO f_info(fname, fpath,fhash) VALUES(?,?,?)", sf.Fname, sf.Fpath, sf.Fhash)
if err != nil {
fmt.Printf("Insert data failed: %v\n", err)
return
}
// 获取自增ID
lastInsertId, _ := res.LastInsertId()
fmt.Printf("Successfully inserted data, lastInsertId = %v\n", lastInsertId)
}
// 查询数据
func query(uid int) (weightList []float64) {
// 结果重量集合
weightList = make([]float64, 0)
// 查询语句
rows, err := db.Query("SELECT weight FROM express_orders WHERE uid = ?", uid)
if err != nil {
fmt.Printf("Failed to query data: %v\n", err)
return
}
for rows.Next() {
var weight float64
err = rows.Scan(&weight)
if err != nil {
fmt.Printf("Failed to read data: %v\n", err)
continue
}
weightList = append(weightList, weight)
}
return weightList
}

5
fstool/go.mod

@ -0,0 +1,5 @@
module fstool
go 1.22.1
require github.com/mattn/go-sqlite3 v1.14.22

2
fstool/go.sum

@ -0,0 +1,2 @@
github.com/mattn/go-sqlite3 v1.14.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o4kU=
github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y=

57
fstool/main.go

@ -0,0 +1,57 @@
package main
import (
// 导入包,导入前缀为下划线,则init函数被执行,然后注册驱动。
"fmt"
"fstool/db"
"fstool/util"
"os"
"path/filepath"
_ "github.com/mattn/go-sqlite3"
)
func main() {
// 获取信息
args := os.Args
// no input
if args == nil || len(args) < 2 {
fmt.Printf("input your real path, like /home etc.\n")
os.Exit(1)
}
// 第一个是输入的参数
// 路径
path := args[1]
//fmt.Printf("your path is :%s\n", path)
// open datebase
db.ConnectDB()
//遍历
// var ftree []string
ftree, err := util.GetDirFilePaths(path, false)
if err != nil {
fmt.Printf("scan error is :%v", err)
}
//计算hash,然后存放到数据库
for _, v := range ftree {
//fmt.Printf("%v\n", v)
// 计算结果
//fmt.Printf("%v,%s\n", filepath.Dir(v), filepath.Base(v))
relpath, err := filepath.Rel(path, v)
if err != nil {
fmt.Printf("relpath error :%v", err)
}
fmt.Printf("relpath:%s\n", filepath.Dir(relpath))
// 拼装文件信息插入数据库
var stf db.StFileInfo
stf.Fhash = util.CalacHash(v)
stf.Fname = filepath.Base(v)
stf.Fpath = filepath.Dir(relpath)
// insert into db
db.InsertStf(stf)
}
// fmt.Printf("scan is :%v", ftree)
// connectDB()
// insert(1, 0.81192)
}

0
fstool/ups.db

59
fstool/util/fsutil.go

@ -0,0 +1,59 @@
package util
import (
"crypto/sha256"
"fmt"
"io"
"os"
"path/filepath"
)
// 遍历目录下的文件
// 是否只扫相对路径下
func GetDirFilePaths(dirPath string, relativeOnly bool) ([]string, error) {
var filePaths []string
err := filepath.Walk(dirPath, func(path string, info os.FileInfo, err error) error {
if err != nil {
return err
}
if !info.IsDir() {
if relativeOnly {
fileName := filepath.Base(path)
relativePath := filepath.ToSlash(filepath.Join(filepath.Base(dirPath), fileName))
filePaths = append(filePaths, relativePath)
} else {
filePaths = append(filePaths, filepath.ToSlash(path))
}
}
return nil
})
if err != nil {
return nil, err
}
return filePaths, nil
}
// 计算文件的hash
func CalacHash(rfile string) string {
// 获取到真实地址
// rpath := filepath.Join(config.G.FilePath, rfile)
//
file, err := os.Open(rfile)
if err != nil {
panic(err)
}
defer file.Close()
// initlize hash object
hash := sha256.New()
// write file into hash object
if _, err := io.Copy(hash, file); err != nil {
panic(err)
}
// get hash value
hashBytes := hash.Sum(nil)
//converto to hash string
hastString := fmt.Sprintf("%x", hashBytes)
return hastString
}
Loading…
Cancel
Save