Golang创建文件权限问题解决方法

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

猜你喜欢

转载自blog.csdn.net/weixin_51261234/article/details/125777100