package main  

import (  
  "fmt"  
  "os"  
)  

func main() {  
    err := os.MkdirAll("/tmp/gotest/", 0777)  
    if err != nil {   
      panic(err)  
    }  
    fmt.Println("Mkdir /tmp/gotest/")  
}  

运行结果:文件夹的权限还是系统默认的755

正确做法

package main

import (
  "fmt"
  "os"
  "syscall"
)

func main() {
    mask := syscall.Umask(0)
    defer syscall.Umask(mask)
    err := os.MkdirAll("/tmp/gotest/", 0777)
    if err != nil {
      panic(err)
    }
    fmt.Println("Mkdir /tmp/gotest/")
}

注意事项

  • 这并不是Go的Bug,包括Linux系统调用都是这样的,创建目录除了给定的权限还要加上系统的Umask,Go也是如实遵循这种约定。

  • Umask是权限的补码,用于设置创建文件和文件夹默认权限的,一般在 /etc/profile中或 $HOME/profile$HOME/.bash_profile



blog comments powered by Disqus

Published

2016-02-27

Categories


Tags