Go言語の小技集(ファイル操作系)

Go_icon Go
この記事は約6分で読めます。

この記事は以下の方を対象に書いています。

  • Go言語でファイル操作系の小技を知りたい

はじめに

今回は、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()関数を使用して、ファイルの情報を取得し、存在確認をします。

os.Stat()関数について

Go言語の標準パッケージで、ファイルまたはディレクトリの詳細情報(サイズ、タイムスタンプ、権限など)を取得することができます。

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)
		}
	}
}

最後に

ここまで読んでいただきありがとうございます。

今回はファイル操作系の小技集を紹介しましたが、

まだまだ少ないので、随時アップデートしていきます。

また、「ここはこうしたほうが良い」などのアドバイスがあればコメントしていただけると幸いです。

コメント

タイトルとURLをコピーしました