Golang | 搞清楚OS模块Mkdir和MkdirAll的区别

Posted Parker@1989

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Golang | 搞清楚OS模块Mkdir和MkdirAll的区别相关的知识,希望对你有一定的参考价值。

开始使用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的原因。

到此结束!下次再见!

以上是关于Golang | 搞清楚OS模块Mkdir和MkdirAll的区别的主要内容,如果未能解决你的问题,请参考以下文章

Python模块详解

转:彻底搞清楚javascript中的requireimport和export

Golang os/user 用户模块

如何在 Golang 中使用 Mkdir 创建嵌套目录?

python -- os处理模块

OS和 time模块介绍