📄

Goでファイルが存在していたらオープン、存在していなかったらファイルを新規作成したい(ReadWrite権限付きで)

2025/01/02に公開

ファイルの存在チェックをして、存在していなかったらCreate、存在していたらReadWrite権限でOpenFileするというコードを最初は書いてたんですよ。こんな感じ↓

package main

import (
	"fmt"
	"os"
)

func main() {
	filePath := "example.txt"

    var file *os.File
    if _, err := os.Stat(filePath); err != nil {
        f, err := os.Create(filePath)
        if err != nil {
            return fmt.Printf("Failed to create file: %v", err)
        }
        file = f
    } else {
        f, err := os.OpenFile(filePath, os.O_RDWR, 0644)
        if err != nil {
            return fmt.Printf("Failed to open file: %v", err)
        }
        file = f
    }
    defer file.Close()


    // 何らかの処理
}

もっとスマートに書ける方法があったので紹介します。

-    var file *os.File
-    if _, err := os.Stat(filePath); err != nil {
-        f, err := os.Create(filePath)
-        if err != nil {
-            return fmt.Printf("Failed to create file: %v", err)
-        }
-        file = f
-    } else {
-        f, err := os.OpenFile(filePath, os.O_RDWR, 0644)
-        if err != nil {
-            return fmt.Printf("Failed to open file: %v", err)
-        }
-        file = f
-    }
+	// ファイルをオープン(存在しない場合は作成)
+	file, err := os.OpenFile(filePath, os.O_RDWR|os.O_CREATE, 0644)
+	if err != nil {
+		fmt.Printf("Failed to open file: %v\n", err)
+		return
+	}
	defer file.Close()

OpenFileのフラグに os.O_CREATE もあったんですね〜。

Discussion