はじめに
Go 1.23で
os
パッケージに追加された
CopyFS
について紹介します。
os.CopyFSでディレクトリをコピーする
Go 1.22 以前は、ディレクトリをコピーする場合は再帰的に行うなどの工夫が必要でしたが、Go 1.23 で追加された
os.CopyFS
を使えば簡単にディレクトリをコピーすることができます。
コードサンプル
os.CopyFS
の使い方は非常にシンプルなので、まずはサンプルコードを記載します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | package main import ( "fmt" "os" ) func main() { err := os.CopyFS("to_dir", os.DirFS("from_dir")) if err != nil { panic(err) } fmt.Println("Copy successful") } |
実行前のディレクトリ構造は以下のとおりです。
1 2 3 4 5 6 7 | . ├── from_dir │ ├── nested │ │ └── sample.txt │ └── sample.txt ├── go.mod └── main.go |
実行後のディレクトリ構造は以下のとおりです。
1 2 3 4 5 6 7 8 9 10 11 | . ├── from_dir │ ├── nested │ │ └── sample.txt │ └── sample.txt ├── go.mod ├── main.go └── to_dir ├── nested │ └── sample.txt └── sample.txt |
このように、ディレクトリがネストしている場合でも正しくコピーすることができます。
os.CopyFS
os.CopyFS
のシグネチャは以下のとおりです。
1 | func CopyFS(dir string, fsys fs.FS) error |
第一引数にはコピー先のディレクトリのパスを渡し、第二引数にはコピー対象を渡します。
os.CopyFS
では、コピーする際に必要に応じてディレクトリが作成されます。
os.CopyFS
でコピーされたファイルのpermissionはumaskの値を受けるため、元のファイルとは異なり、644になりました(ディレクトリの場合は755)。
もしコピー先に同じファイルがある場合は、コピー元のファイルで上書きされました(コピー先にしかないファイルはそのまま)。
コピー対象としてSymbolicはサポートされていないため、エラーが返ります。
1 | panic: CopyFS link/sample.txt: invalid argument |
さいごに
Go 1.23で
os
パッケージに追加された
CopyFS
について、サンプルコードと実際の挙動を交えて紹介しました。