LoginSignup
18
11

More than 5 years have passed since last update.

Go言語でファイル操作: ディレクトリの作り方

Posted at

この記事の目的

  • Go言語でディレクトリを作れるようになる
  • Go言語でパーミッションを指定してディレクトリを作れるようになる
  • Go言語でツリー構造のディレクトリを作れるようになる

準備

適当に作業用のディレクトリを作る:

mkdir ~/Desktop/gofile
cd ~/Desktop/gofile/

処理を書いていくGoのファイルを作ってエディタで開く:

touch main.go

ディレクトリを作る

ディレクトリの作り方を覚える。os モジュールの Mkdir で作れる。

main.go
package main

import "os"

func main() {
    os.Mkdir("/tmp/go-dir1", 0777)
}

実行する:

go run main.go

できたか見てみる:

% ls -la /tmp/                                                                                                                                                         
...
drwxr-xr-x   2 suin           wheel    68 Dec 10 16:04 go-dir1

できているが、パーミッションが 755 になっている…

パーミッション777でディレクトリを作る

上での例は、どうやら umask の設定が反映された結果と思われる。

umaskを復習する:

(エディタでも touch コマンドでも何でもいいから)ファイルを作成すると、そのファイルのパーミッションは、普通 644 (rw-r--r--) となるはずである。これはもっともな話で、新しいファイルを作るたびにパーミッションが 666 (rw-rw-rw-) や 777 (rwxrwxrwx) になっていては誰でも書き込めてしまい、いちいち chmod しなくてはならず不便である。このように、新規作成したファイル・ディレクトリのパーミッションを決めるのが、umask である。

umask は、新しくファイルを作成する際に、許可*しない*ビットを示すものである。普通、ファイルの新規作成時はファイルの実行ビット (eXecute) は立てないので、umask が 022 ということは、666 から 022 を引いた 644 というパーミッションで新規ファイルが作られることになる。umask が 002 なら 664 、 umask が 000 なら 666 となる。

出典: http://x68000.q-e-d.net/~68user/unix/pickup?umask

デフォルトの umask値 を確認する:

% umask
022

Go言語ではsyscall.Umaskでumask値を変更できる。
一旦、umask値を変更して、0777でディレクトリを作り、umask値を元に戻すように変更したコード:

main.go
package main

import (
    "os"
    "syscall"
)

func main() {
    defaultUmask := syscall.Umask(0)
    os.Mkdir("/tmp/go-dir2", 0777)
    syscall.Umask(defaultUmask)
}

実行する:

go run main.go

777でディレクトリが作成された:

% ls -la /tmp/ 
...
drwxrwxrwx   2 suin           wheel    68 Dec 10 16:22 go-dir2

chmodでパーミッションを変える別解

umask値を変えてもいいが、chmodで後からパーミッションを変える方法もある:

main.go
package main

import (
    "os"
)

func main() {
    directory := "/tmp/go-dir3"
    os.Mkdir(directory, os.ModePerm)
    os.Chmod(directory, 0777)
}

実行する:

go run main.go

777のディレクトリが作成された:

% ls -la /tmp/
…
drwxrwxrwx   2 suin           wheel    68 Dec 10 16:26 go-dir3

ツリー構造のディレクトリを作る

下記の図のように、親ディレクトリ /tmp/go-dirs/ を作り、その中に小ディレクトリ 01~10 を作るコードを書いてみる

/tmp/go-dirs/
├── 01
├── 02
├── 03
├── 04
├── 05
├── 06
├── 07
├── 08
├── 09
└── 10

os.MkdirAll を使うと、親ディレクトリがなければ親ディレクトリを作ってくるので、今回はそれを使ってコードを書く:

main.go
package main

import (
    "fmt"
    "os"
)

func main() {
    for i := 1; i <= 10; i++ {
        os.MkdirAll(fmt.Sprintf("/tmp/go-dirs/%02d", i), os.ModePerm)
    }
}

実行してみる:

go run main.go

結果:

% tree /tmp/
/tmp/
...
├── go-dirs
│   ├── 01
│   ├── 02
│   ├── 03
│   ├── 04
│   ├── 05
│   ├── 06
│   ├── 07
│   ├── 08
│   ├── 09
│   └── 10
...
18
11
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
18
11