1.需求:
制作一个.exe可执行程序,对现有的文件夹及子文件夹下所有照片和视频进行解析。如果是照片,按拍摄时间年份,移动到年份文件夹;如果是视频,移动到一个文件夹下;
2.实现:
选用Go语言编写程序,不需要安装运行环境,直接编译为.exe文件,终端用户直接点击.exe执行;
3.前置准备:
GO开发和编译环境执行自行百度;
4.效果:![](https://i-blog.csdnimg.cn/blog_migrate/1e847481a557f8ee98acad72bac11c50.png)
5.代码:
package main
import (
"fmt"
"log"
"os"
"path/filepath"
"strings"
"time"
)
func main() {
f, err := os.OpenFile("./errFile.log", os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0644)
if err != nil {
fmt.Printf("保存日志文件出错:%v\n", err)
log.Fatal(err)
}
defer f.Close()
//设置日志输出
log.SetOutput(f)
root := "." // 设置要扫描的根目录,这里使用当前目录作为示例
err = filepath.Walk(root, func(path string, info os.FileInfo, err error) error {
if err != nil {
fmt.Printf("访问路径 %q 时出错:%v\n", path, err)
log.Printf("访问路径 %q 时出错:%v\n", path, err)
return nil
}
if !info.IsDir() && isPhotoFile(info.Name()) {
fmt.Println("文件名:", info.Name())
log.Println("文件名:", info.Name())
// 获取文件的创建时间
createTime, err := getCreateTime(path)
year := fmt.Sprintf("%d", createTime.Year())
if err != nil {
fmt.Printf("获取创建时间失败:%v\n", err)
log.Printf("获取创建时间失败:%v\n", err)
}
err = os.MkdirAll(year, os.ModePerm)
if err != nil {
fmt.Println("创建目录异常:", err)
log.Println("创建目录异常:", err)
return err
}
err = os.Rename(path, year+"/"+info.Name())
if err != nil {
return err
}
fmt.Printf("移动文件 %s 到 %s\n", path, year)
log.Printf("移动文件 %s 到 %s\n", path, year)
} else if !info.IsDir() && isVideoFile(info.Name()) {
fmt.Println("文件名:", info.Name())
log.Println("文件名:", info.Name())
// 获取文件的创建时间
vidoePath := "video"
err = os.MkdirAll(vidoePath, os.ModePerm)
if err != nil {
fmt.Println("创建目录异常:", err)
log.Println("创建目录异常:", err)
return err
}
err = os.Rename(path, vidoePath+"/"+info.Name())
if err != nil {
return err
}
fmt.Printf("移动文件 %s 到 %s\n", path, vidoePath)
log.Printf("移动文件 %s 到 %s\n", path, vidoePath)
} else {
fmt.Println("非图片视频文件名:", info.Name())
log.Println("非图片视频文件名:", info.Name())
}
return nil
})
if err != nil {
fmt.Printf("遍历目录出错:%v\n", err)
log.Printf("遍历目录出错:%v\n", err)
}
//休眠5秒 再关闭窗口
time.Sleep(10 * time.Second)
}
// 获取文件的创建时间(单位为秒)
func getCreateTime(filePath string) (time.Time, error) {
fileInfo, err := os.Stat(filePath)
if err != nil {
return time.Time{}, err
}
modTime := fileInfo.ModTime()
return modTime.Truncate(time.Second), nil
}
// 检查文件是一个 照片
func isPhotoFile(path string) bool {
ext := strings.ToLower(filepath.Ext(path))
for _, v := range []string{".jpg", ".jpeg", ".png", ".gif", ".nef"} {
if v == ext {
return true
}
}
return false
}
// 检查文件是一个 视频
func isVideoFile(path string) bool {
ext := strings.ToLower(filepath.Ext(path))
for _, v := range []string{".mp4", ".avi", ".mov"} {
if v == ext {
return true
}
}
return false
}
6.最终编译的程序:
点击本文标题下的【立即下载】按钮下载 photo.exe 文件
7.使用方法:
把程序和需要整理的图片文件放在同一个文件夹里面;
然后点击photo.exe文件执行
最终程序会按年份分类照片和视频