theme: channing-cyan

开始使用Golang的时候,不太明白os模块中Mkdir和MkdirAll方法的区别,一直看别人的代码用MkdirAll,自己也就一直用,今天突然想到这个问题,所以想了解一下,然后就看了一下源码,发现解释的很清楚,就是自己太懒了,懒得看。这里只是简单记录一下。

源码的解释

~ ⌚ 16:19:00
$ go doc os Mkdir
package os // import "os"

func Mkdir(name string, perm FileMode) error
    Mkdir creates a new directory with the specified name and permission bits
    (before umask). If there is an error, it will be of type *PathError.


~ ⌚ 16:20:19
$ go doc os MkdirAll
package os // import "os"

func MkdirAll(path string, perm FileMode) error
    MkdirAll creates a directory named path, along with any necessary parents,
    and returns nil, or else returns an error. The permission bits perm (before
    umask) are used for all directories that MkdirAll creates. If path is
    already a directory, MkdirAll does nothing and returns nil.

Mkdir和MkdirAll其实就是shell命令中mkdir和mkdir -p的区别,一个是创建目录,一个是循环创建多级目录。

这里我们使用几个简单的例子来说明

首先我们创建简单的一级目录

err := os.Mkdir("Test", os.ModePerm)     //这样可以创建成功
	if err != nil {
		fmt.Println(err)
	}

我们再次创建多级目录

err := os.Mkdir("Path01/Path02", os.ModePerm)
	if err != nil {
		fmt.Println(err)      //报错:mkdir Path01/Path02: no such file or directory
	}

可以发现Mkdir是不能创建多级目录的

然后我们使用MkdirAll来试一下

err := os.MkdirAll("Path01/Path02", os.ModePerm)   //可以创建成功
	if err != nil {
		fmt.Println(err)
	}

到这里我们也明白了Mkdir和MkdirAll的区别了吧,那么MkdirAll可不可以创建一级目录呢,推测应该也可以吧,这里我们还是验证一下

err := os.MkdirAll("test01", os.ModePerm)
	if err != nil {
		fmt.Println(err)       //可以创建成功
	}

所以MkdirAll可以创建一级目录,也可以创建多级目录,而Mkdir只能创建一级目录,这也就是为什么大家都喜欢用MkdirAll的原因。

到此结束!下次再见!