os.remove()仅删文件且不可删目录,os.removeall()递归删目录树;删除前须用os.stat()判断类型并校验路径,跨平台需处理文件占用与权限问题。

os.Remove() 删除单个文件最常用
删除文件最直接的方式就是调用 os.Remove(),它接受一个文件路径字符串,成功时返回 nil,失败则返回 error。注意:它**不能删目录**,哪怕目录为空也会报 is a directory 错误。
常见错误现象:remove xxx: is a directory —— 说明你传了目录路径却用了 os.Remove();no such file or directory 不一定真不存在,也可能是权限不足或路径有符号链接断裂。
- 务必检查返回的
error,不要忽略 - 路径建议用
filepath.Clean()预处理,避免../绕过校验 - 若需静默删除(即文件不存在也不报错),可先用
os.Stat()判断,或直接忽略os.IsNotExist(err)
os.RemoveAll() 安全删除目录及其全部内容
要删空目录或整个目录树,必须用 os.RemoveAll()。它会递归删除指定路径下所有子文件、子目录,最后删除该目录本身。和 Remove() 一样,它也返回 error。
使用场景:清理临时目录、测试生成的输出目录、卸载插件数据等。
Android文件存取与数据库编程知识,文件操作主要是读文件、写文件、读取静态文件等,同时还介绍了创建添加文件内容并保存,打开文件并显示内容;数据库编程方面主要介绍了SQLite数据库的使用、包括创建、删除、打开数据库、非查询SQL操作指令、查询SQL指令-游标Cursors等知识。
立即学习“go语言免费学习笔记(深入)”;
- 它不区分“是否为空”,只要路径存在且可写,就全删
- 不会跳过只读文件(在 Linux/macOS 下可能失败;Windows 下通常能删,但行为依赖系统权限)
- 没有内置 dry-run 模式,误传根路径如
"/"或"."可能造成严重后果——务必校验路径合法性
删除前判断类型避免 panic 或误操作
很多 bug 来自“以为是文件,其实是目录”,或反过来。推荐在调用删除函数前,先用 os.Stat() 获取 os.FileInfo,再用 IsDir() 和 IsRegular() 明确类型。
示例逻辑:
fi, err := os.Stat(path)
if err != nil {
if os.IsNotExist(err) { return } // 忽略不存在
log.Fatal(err)
}
if fi.IsDir() {
os.RemoveAll(path) // 目录走 RemoveAll
} else {
os.Remove(path) // 文件走 Remove
}
-
fi.Mode().IsDir()和fi.IsDir()效果一致,后者更简洁 - 不要仅靠后缀或字符串判断类型,
os.Stat()才是唯一可信依据 - 注意符号链接:默认
os.Stat()不跟随链接,要用os.Lstat()获取链接本身信息
跨平台删除要注意权限与残留
Windows 对正在被进程占用的文件加锁,此时 os.Remove() 会返回 The process cannot access the file because it is being used by another process;Linux/macOS 虽允许“unlink”已打开的文件,但磁盘空间要等所有 fd 关闭才释放。
- Windows 下若遇占用,可尝试重命名(
os.Rename())为临时名再删,或等待几毫秒后重试(最多 2–3 次) - 某些编辑器(如 VS Code)会在文件旁生成
.xxx.swp或.xxx~,批量删除时建议排除这些模式 - 删除后建议用
os.Stat()再检一次,确认是否真正消失——尤其在 CI/CD 环境中,残留文件可能引发后续步骤失败
os.IsPermission(err) 当作不存在而跳过,结果掩盖了真正的权限配置问题。









