0

0

Golang初级项目:自动重命名相册工具_根据EXIF信息重命名

P粉602998670

P粉602998670

发布时间:2026-02-25 17:08:03

|

851人浏览过

|

来源于php中文网

原创

go标准库不支持jpeg exif读取,需用第三方包;常见错误包括未校验文件有效性、误处理无exif的图片(如手机直出、微信图),应先检查jpeg头、文件大小,再按datetimeoriginal等优先级解析时间,并安全重命名与并发控制。

golang初级项目:自动重命名相册工具_根据exif信息重命名

Go 读取 JPEG EXIF 信息为什么总返回空?

因为 Go 标准库不支持 EXIF,必须用第三方包,且常见错误是没检查文件是否真有 EXIF 数据或误读了缩略图段。很多照片(尤其是手机直出、微信转发、截图)压根没嵌入完整 EXIF,exif.Read 会静默返回 nil 或部分字段为空,不是代码写错了。

  • github.com/rwcarlsen/goexif/exif(注意是旧版,兼容性好)或更现代的 github.com/xor-gate/goexif2/exif,后者支持更多字段但要求 Go 1.16+
  • 务必在调用 exif.Decode 前用 os.Stat 确认文件存在且非零大小,再用 bytes.HasPrefix 检查前几个字节是否为 JPEG0xFF 0xD8),避免对 PNG/HEIC 文件硬解
  • exif.DateTime 字段最常用,但它可能不存在;实际应 fallback 到 exif.DateTimeOriginalexif.DateTimeDigitized,三者语义不同:原拍摄时间 > 数码化时间 > 文件修改时间

重命名时怎么安全生成新文件名?

直接拼接字符串 + os.Rename 极易出错——路径含中文、冒号、斜杠,或目标名已存在,或跨磁盘移动失败。Golang 不自动处理这些边界,得自己兜底。

  • filepath.Basefilepath.Dir 拆分路径,新文件名只操作 basename,保留原目录结构
  • 时间格式建议用 time.Format("20060102_150405")(Go 唯一固定 layout),避免 : 和空格;中文系统下还要用 strings.Map 过滤掉 Windows 不允许的字符( : " / \ | ? *
  • 重命名前必须检查目标路径是否存在:os.Stat(newPath),若存在则加序号后缀(如 _1),而不是覆盖——相册文件一旦覆盖就不可逆

批量处理大量照片时卡住或崩溃?

默认串行读取+解析+重命名,1000 张照片可能耗时数分钟,且内存暴涨(每张图加载进内存解 EXIF)。问题不在逻辑,而在 IO 和并发控制没做。

知元AI
知元AI

AI智能语音聊天 对讲问答 AI绘画 AI写作 AI创作助手工具

下载
  • 不要一次性 filepath.Glob("*.jpg") 后全塞进内存;改用 filepath.WalkDir 流式遍历,边发现边处理
  • 用带缓冲的 channel 控制并发数(比如 sem := make(chan struct{}, 4)),每次 goroutine 启动前 sem ,结束时 <code>,避免打开太多文件句柄触发 <code>too many open files
  • EXIF 解析是 CPU 密集型,但 I/O 更慢,所以并发 4–8 即可,再多无收益,反而增加调度开销

Windows 下中文路径乱码或权限拒绝?

Go 1.16+ 在 Windows 上默认用 UTF-16 调用系统 API,但某些老旧文件系统(如 FAT32 U 盘)或杀毒软件会拦截重命名操作,报错 Access is denied 或返回乱码路径。

立即学习go语言免费学习笔记(深入)”;

  • 路径一律用 filepath.ToSlash 统一为正斜杠,避免反斜杠转义问题;打印调试时用 fmt.Printf("%q", path) 查看真实字节
  • 遇到 permission denied,先检查文件是否被资源管理器预览窗格锁定(关掉「预览窗格」再试),或用 lsof(WSL)或 Process Explorer 查进程占用
  • 别依赖 os.Getwd() 当基准路径——它可能返回短路径名(C:\USERS\ADMINI~1\...),导致后续 filepath.Join 拼错;显式用 os.Executable() 或传入绝对路径参数更稳

EXIF 时间字段缺失、跨文件系统移动、中文符号过滤、并发锁粒度——这些不是“功能做完就完事”的点,而是每次运行都可能突然冒出来的具体阻力。绕不开,只能一个个钉死。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
golang如何定义变量
golang如何定义变量

golang定义变量的方法:1、声明变量并赋予初始值“var age int =值”;2、声明变量但不赋初始值“var age int”;3、使用短变量声明“age :=值”等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

207

2024.02.23

golang有哪些数据转换方法
golang有哪些数据转换方法

golang数据转换方法:1、类型转换操作符;2、类型断言;3、字符串和数字之间的转换;4、JSON序列化和反序列化;5、使用标准库进行数据转换;6、使用第三方库进行数据转换;7、自定义数据转换函数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

242

2024.02.23

golang常用库有哪些
golang常用库有哪些

golang常用库有:1、标准库;2、字符串处理库;3、网络库;4、加密库;5、压缩库;6、xml和json解析库;7、日期和时间库;8、数据库操作库;9、文件操作库;10、图像处理库。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

350

2024.02.23

golang和python的区别是什么
golang和python的区别是什么

golang和python的区别是:1、golang是一种编译型语言,而python是一种解释型语言;2、golang天生支持并发编程,而python对并发与并行的支持相对较弱等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

212

2024.03.05

golang是免费的吗
golang是免费的吗

golang是免费的。golang是google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的开源编程语言,采用bsd开源协议。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

405

2024.05.21

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

365

2025.06.09

golang相关判断方法
golang相关判断方法

本专题整合了golang相关判断方法,想了解更详细的相关内容,请阅读下面的文章。

200

2025.06.10

golang数组使用方法
golang数组使用方法

本专题整合了golang数组用法,想了解更多的相关内容,请阅读专题下面的文章。

1111

2025.06.17

batoto漫画官网入口与网页版访问指南
batoto漫画官网入口与网页版访问指南

本专题系统整理batoto漫画官方网站最新可用入口,涵盖最新官网地址、网页版登录页面及防走失访问方式说明,帮助用户快速找到batoto漫画官方平台,稳定在线阅读各类漫画内容。

125

2026.02.25

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Go 教程
Go 教程

共32课时 | 5.5万人学习

Go语言实战之 GraphQL
Go语言实战之 GraphQL

共10课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号