项目OTA的需求 前面的文章完成了一个文件的设计 对于传统MCU项目已然足够 但是当前我们还有一些前端的文件 倘若这些文件需要改动 那是鞭长莫及的 怎么办? 很容易想到的思路一 把需要修改的文件 统统放在一个文件夹? 那么就还需要 准备一个描述各个文件改动的情况(增/删/改)? 然后集体压缩打包 然后收到压缩包以后解压? 然后根据描述文件 执行相应的文件操作 那么就还需要 准备一个动态的解析文件描述的脚本
思路是没有问题 但是山高水远 我断然不会上路
凡是不要慌 先想好 再编程
继续思考 我果然想到一个非常创新的idea! 这些让人头疼的 增/删/改 其实已经有工具管理了? 利用git工具 开始反弹琵琶的设计 模拟情况如下:
荷兰有一个PI 它的文件夹我本地有一个1:1的模型
此时我们都是这个样子
D1
D2
需要做OTA的 我本地一定要认真验证的 假设本地的改动如下
1--删除D:\KuGou\Y\dashboard\css\bootstrap\mixins 里面一个文件
2--增加一个TXT
3--改动2个文件
上面的修改都是再Y里面
我再X里面git init
然后把X里面的.git 放到Y
直接git status
?全部出来了!!
再Y里面提交一次
然后把Y里面的。git 复制到X里面就好了!
怎么复制的 我套一个壳子
假设我做成了GIT.ZIP
我i再X里面执行
删除一个目录下部分类型之外的所有文件的三种方法
?rm -i !(*.zip)
win 无法执行了
就只有这个ZIP文件了
然后加压 就只有。git文件
然后git reset --hard HEAD 就和Y一样了
第一步准备好提交
第二部把本地的。git文件做成压缩包
第三步 把压缩包上报到平台
第四步把压缩包下载到树莓派
第五步验证没有问题 把文件夹里面除了ZIP的全部del? rm -rf -v !(*.mod)? 删除处理。mod以外的一切
然后解压 然后git reset --hard HEAD 然后del这个zip
全部更新完成
还可以回滚!!!
怎么处理。git文件的压缩
它其实是文件夹
1--重命名 就可以
2--解压可以回来的?
3怎么加密?没有实现
代码如下
package main
import (
"archive/zip"
"io"
"log"
"os"
"path/filepath"
)
func zipDir(dir, zipFile string) {
fz, err := os.Create(zipFile)
if err != nil {
log.Fatalf("Create zip file failed: %s\n", err.Error())
}
defer fz.Close()
w := zip.NewWriter(fz)
defer w.Close()
filepath.Walk(dir, func(path string, info os.FileInfo, err error) error {
if !info.IsDir() {
fDest, err := w.Create(path[len(dir)+1:])
if err != nil {
log.Printf("Create failed: %s\n", err.Error())
return nil
}
fSrc, err := os.Open(path)
if err != nil {
log.Printf("Open failed: %s\n", err.Error())
return nil
}
defer fSrc.Close()
_, err = io.Copy(fDest, fSrc)
if err != nil {
log.Printf("Copy failed: %s\n", err.Error())
return nil
}
}
return nil
})
}
func unzipDir(zipFile, dir string) {
r, err := zip.OpenReader(zipFile)
if err != nil {
log.Fatalf("Open zip file failed: %s\n", err.Error())
}
defer r.Close()
for _, f := range r.File {
func() {
path := dir + string(filepath.Separator) + f.Name
os.MkdirAll(filepath.Dir(path), 0755)
fDest, err := os.Create(path)
if err != nil {
log.Printf("Create failed: %s\n", err.Error())
return
}
defer fDest.Close()
fSrc, err := f.Open()
if err != nil {
log.Printf("Open failed: %s\n", err.Error())
return
}
defer fSrc.Close()
_, err = io.Copy(fDest, fSrc)
if err != nil {
log.Printf("Copy failed: %s\n", err.Error())
return
}
}()
}
}
func main() {
os.Rename("C:\\Users\\Koson.Gong\\Desktop\\XX\\.git", "C:\\Users\\Koson.Gong\\Desktop\\XX\\IMG")
zipDir("C:\\Users\\Koson.Gong\\Desktop\\XX\\IMG", "C:\\Users\\Koson.Gong\\Desktop\\XX\\IMG.zip")
unzipDir("C:\\Users\\Koson.Gong\\Desktop\\XX\\IMG.zip", "D:\\adb\\.git")
}
?golang 进行文件夹的压缩与解压 - Go语言中文网 - Golang中文社区
这个也可以
package main
import (
"archive/zip"
"io"
"os"
"path/filepath"
"strings"
)
func main() {
//Zip("C:\\Users\\Koson.Gong\\Desktop\\XX\\IMG", "IMG.ZIP")
//Zip(`C:\Users\Koson.Gong\Desktop\XX\IMG`, `IMG.ZIP`)
//Zip("C:/Users/Koson.Gong/Desktop/XX/IMG", "IMG.ZIP")
Zip("./IMG", "IMG.ZIP")
}
// 打包成zip文件
func Zip(src_dir string, zip_file_name string) {
// 预防:旧文件无法覆盖
os.RemoveAll(zip_file_name)
// 创建:zip文件
zipfile, _ := os.Create(zip_file_name)
defer zipfile.Close()
// 打开:zip文件
archive := zip.NewWriter(zipfile)
defer archive.Close()
// 遍历路径信息
filepath.Walk(src_dir, func(path string, info os.FileInfo, _ error) error {
// 如果是源路径,提前进行下一个遍历
if path == src_dir {
return nil
}
// 获取:文件头信息
header, _ := zip.FileInfoHeader(info)
header.Name = strings.TrimPrefix(path, src_dir+`/`)
// 判断:文件是不是文件夹
if info.IsDir() {
header.Name += `/`
} else {
// 设置:zip的文件压缩算法
header.Method = zip.Deflate
}
// 创建:压缩包头部信息
writer, _ := archive.CreateHeader(header)
if !info.IsDir() {
file, _ := os.Open(path)
defer file.Close()
io.Copy(writer, file)
}
return nil
})
}
怎么加密?
https://segmentfault.com/q/1010000018149446
GitHub - yeka/zip: Fork of Go's archive/zip to add reading/writing of password protected zip files.
有空在研究
++++放弃加密 就ZIP文件以后 就不是文件夹了 就是一个文件 做它的MD5++
package main
import (
"crypto/md5"
"encoding/hex"
"fmt"
"io"
"os"
)
// 获取文件的md5码
func getFileMd5(filepath string) string {
// 文件全路径名
//path := fmt.Sprintf("./%s", filename)
pFile, err := os.Open(filepath)
if err != nil {
fmt.Errorf("打开文件失败,filepath=%v, err=%v", filepath, err)
return ""
}
defer pFile.Close()
md5h := md5.New()
io.Copy(md5h, pFile)
fmt.Printf("file:[%s] MD5:[%s]\r\n", filepath, hex.EncodeToString(md5h.Sum(nil)))
return hex.EncodeToString(md5h.Sum(nil))
}
func main() {
getFileMd5("./IMG.ZIP")
}
方案3:本地有git了
平台下发url
本地执行git pull即可!我现在是自己把。git拿过去更新 它也可以自己拉新的img
|