はじめに
今回は、Go言語でちょっとした小技を紹介していきます。
僕も最近始めたばかりなので、気軽に見ていただけると幸いです。
ファイル名の取得
package main
import (
"fmt"
"path/filepath"
)
func main() {
// 対象のファイルパス
path := "C:\\work\\test.txt"
// ファイル名を取得
filename := filepath.Base(path)
// 出力
fmt.Println("対象ファイル名:", filename)
// 対象ファイル名: test.txt
}
ちなみに、ファイルパスは、相対パスでもOKです。
相対パスで書く際は、実行するファイルから見た場所になります。
ファイルの存在確認
次は、対象のファイルが存在するか確認してみます。
os.Stat()関数を使用して、ファイルの情報を取得し、存在確認をします。
package main
import (
"fmt"
"os"
)
func main() {
// 対象のファイルパス
path := "C:\\work\\test.txt"
// 存在確認
_, err := os.Stat(path)
if err != nil {
if os.IsNotExist(err) {
fmt.Println("対象ファイル無し")
} else {
fmt.Println("エラー:", err)
}
return
}
fmt.Println("対象ファイル有り")
// 対象ファイル有り
}
ファイルの詳細情報取得
次は、上記のos.Stat()関数を使用して、ファイルの詳細情報を取得してみます。
package main
import (
"fmt"
"os"
)
func main() {
// 対象のファイルパス
path := "C:\\work\\test.txt"
// 存在確認
fileInfo, err := os.Stat(path)
if err != nil {
fmt.Println("エラー:", err)
return
}
fmt.Println("ファイルかディレクトリか判定:", fileInfo.IsDir()) // ファイルかディレクトリか判定: false
fmt.Println("サイズ(バイト):", fileInfo.Size()) // サイズ(バイト): 0
fmt.Println("モード(権限):", fileInfo.Mode()) // モード(権限): -rw-rw-rw-
fmt.Println("作成日時:", fileInfo.ModTime()) // 作成日時: 2023-10-04 23:20:09.5148147 +0900 JST
fmt.Println("ファイル名:", fileInfo.Name()) // ファイル名: test.txt
}
特定の条件指定
今度は特定の条件に当てはまるファイルを全て抜き出す小技です。
package main
import (
"fmt"
"os"
"path/filepath"
)
// 特定の条件に合致するかどうかを判定する関数
func yourCondition(info os.FileInfo) bool {
// 例: ファイルサイズが1000バイト未満の場合
return info.Size() < 1000
}
func main() {
// ディレクトリのパスを指定
rootDir := "C:\\work"
conditionFunc := func(path string, info os.FileInfo, err error) error {
if err != nil {
return err
}
// ディレクトリじゃない && 関数に定義した条件
if !info.IsDir() && yourCondition(info) {
// 特定の条件に合致するファイル名を表示
fmt.Println("ファイル名:", info.Name())
}
return nil
}
err := filepath.Walk(rootDir, conditionFunc)
if err != nil {
fmt.Println("エラー:", err)
}
// ファイル名: test.txt
// ファイル名: test2.txt
}
ファイル削除
今度は、ファイルを削除してみます。
今までは絶対パスだったので、相対パスでファイルの指定をします。
package main
import (
"fmt"
"os"
)
func main() {
// ファイルパス(相対パス)
path := "target/test.txt"
// 対象の削除
err := os.Remove(path)
if err != nil {
fmt.Println("対象ファイルは存在しません。")
return
}
fmt.Printf("%sは削除されました。", path)
}
複数ファイルを一気に削除したい場合は、以下のように記述します。
package main
import (
"fmt"
"os"
"path/filepath"
)
func main() {
// 全てのテキストファイル
pattern := "target/*.txt"
// パターンに一致するファイルを取得
matches, err := filepath.Glob(pattern)
if err != nil {
fmt.Println("ファイルの取得に失敗しました:", err)
return
}
// パターンに一致するファイルを順番に削除
// ※使用しない変数は「_」を使う
for _, filePath := range matches {
err := os.Remove(filePath)
if err != nil {
fmt.Printf("ファイルの削除に失敗しました: %s - %v\n", filePath, err)
} else {
fmt.Printf("ファイルが削除されました: %s\n", filePath)
}
}
}
最後に
ここまで読んでいただきありがとうございます。
今回はファイル操作系の小技集を紹介しましたが、
まだまだ少ないので、随時アップデートしていきます。
また、「ここはこうしたほうが良い」などのアドバイスがあればコメントしていただけると幸いです。
コメント