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 还不支持递归更改多个文件夹的权限,所有需要一个一个调用。