Golang创建文件权限问题解决方法
前言:
最近在写一个关于excel的功能,其中有一个需求就是将每天上传的excel表格归纳到当天的文件夹中,这需要时间判断然后每天创建对应的文件夹,我在本地实现这个功能之后就上传了我的代码,但是线上却出了问题,每次导入文件之后,没有生成对应的文件夹。在排查了配置,代码等一系列问题之后,发现问题出现在创建权限上。
1.分析
-
在本地运行代码,文件夹不会牵扯到linux系统权限问题,所以我们的程序可以正常的运行,但是当我们将自己程序跑在服务器上就不一样了,这里会牵扯到linux文件权限。
-
原因是:需要打开一个文件夹,那么必须要有当前文件夹的执行权限
**x**
,Linux 下设计一切皆文件,文件夹也是一个特殊的文件 -
如果使用
**os.MkdirAll**
方法创建文件夹时,必须基于文件夹所有者x
执行权限以及w
写权限,为什么需要写权限,可以通过vim
去打开一个文件夹,可以看到文件夹里的信息(记得吗,文件夹也是文件),比如我一个文件夹通过 vim 打开的信息:
" ============================================================================
" Netrw Directory Listing (netrw v155)
" /home/g10guang/Templates/blog
" Sorted by name
" Sort sequence: [\/]$,\<core\%(\.\d\+\)\=\>,\.h$,\.c$,\.cpp$,\~\=\*$,*,\.o$,\.obj$,\.info$,\.swp$,\.ba
" Quick Help: <F1>:help -:go up dir D:delete R:rename s:sort-by x:special
" ==============================================================================
../
./
.git/
.sass-cache/
_posts/
_site/
g10guang.github.io/
.gitignore
.gitmodules
404.html
Gemfile
Gemfile.lock
_config.yml
about.md
index.md
- 文件夹中记录着里面有哪些文件以及文件夹,其中
**xxx/**
有**/**
结尾的是文件夹,其他的是文件,所以在文件夹中创建一个文件夹需要改变文件夹信息,需要有写文件夹的权限
2.创建指定权限文件方法
1.方法一:
改变 **umask**
后再创建文件,其后再把 **umask**
改为原来的 umask
import (
"os"
"fmt"
"syscall"
)
func main() {
mask := syscall.Umask(0) // 改为 0000 八进制
defer syscall.Umask(mask) // 改为原来的 umask
err := os.MkdirAll("test/test1/test2", 0766)
if err != nil {
fmt.Println(err)
}
}
2.方法二
先创建文件,然后再改变文件的权限
//创建文件并给予权限
err := os.MkdirAll("uploads/import_excel/", 0777)
if err != nil {
fmt.Println("创建目录失败")
err := os.Chmod("uploads/", 0777)
if err != nil {
fmt.Println("改变uploads权限失败")
}
err = os.Chmod("uploads/import_excel/", 0777)
if err != nil {
fmt.Println("改变import_excel权限失败")
}
}
golang 还不支持递归更改多个文件夹的权限,所有需要一个一个调用。