kurumi-bioの雑記帳

プログラミング、パソコン、ペット、 犬、お出かけ

初心者のGo言語 -25- <Setenv,Symlink,TempDir,Truncate>

こんにちは、kurumi-bioです。
第11回目のosパッケージ(標準ライブラリー)の学習です。

環境

  • Windows
    OSバージョン:Windows11 Home 22H2
    Go言語のバージョン:go version go1.20 windows/amd64
  • Linux
    OSバージョン:openSUSE Leap 15.4
    Go言語のバージョン:go version go1.20.1 linux/amd64

Setenv関数

func Setenv(key, value string) error

関数の説明Setenv は、キーによって指定された環境変数の値を設定します。エラーがあれば、それを返します。

◆テストコード

package main

import (
    "fmt"
    "os"
)

func main() {
    e := os.Setenv("TEST", "TEST")
    if e != nil {
        fmt.Fprintf(os.Stderr, "%v\n", os.NewSyscallError("os.Setenv", e))
        return
    }
    fmt.Printf("TEST=[%s]\n", os.Getenv("TEST"))

    e = os.Setenv("TEST", fmt.Sprintf("%s;TEST2", os.Getenv("TEST")))
    if e != nil {
        fmt.Fprintf(os.Stderr, "%v\n", os.NewSyscallError("os.Setenv", e))
        return
    }
    fmt.Printf("TEST=[%s]\n", os.Getenv("TEST"))
}

コードの説明環境変数TESTに"TEST"という値を設定しています。環境変数TESTに";TEST2"という値を追加するためos.Getenv()関数を使って既存の値を取得後fmt.Sprintf()で連結しています。

◆実行結果(Windows)

実行結果の説明

  • 1行目:環境変数TESTの値が"TEST"になりました。
  • 2行目:";TEST2"が追記されて、環境変数TESTの値が"TEST;TEST2"になりました。

Symlink関数

func Symlink(oldname, newname string) error

関数の説明 Symlink は、oldname へのシンボリック リンクとして newname を作成します。 Windows では、存在しない古い名前へのシンボリック リンクは、ファイルのシンボリック リンクを作成します。 oldname が後でディレクトリとして作成された場合、シンボリック リンクは機能しません。エラーが発生した場合、タイプは *LinkError になります。

◆テストコード

package main

import (
    "fmt"
    "os"
)

func cf(filePath string) {
    e := os.WriteFile(filePath, []byte("Write Test"), 0666)
    if e != nil {
        fmt.Fprintf(os.Stderr, "%v\n", os.NewSyscallError("os.WriteFile", e))
        return
    }
}

func mk(dirName string) {
    e := os.Mkdir(dirName, 0100)
    if e != nil {
        fmt.Fprintf(os.Stderr, "Error: %v \n", e)
        os.Exit(1)
    }
}

func sl(old, new string) {
    e := os.Symlink(old, new)
    if e != nil {
        fmt.Fprintf(os.Stderr, "%v\n", os.NewSyscallError("os.Symlink", e))
        return
    }
}

func main() {
    cf("linkTest")
    sl("linkTest", "linkTest-s")

    sl("non", "non-s")

    mk("testDir")
    sl("testDir", "testDir-s")
}

コードの説明cf関数でファイルを作成後に作成したファイルにシンボリックリンクを作成。存在しないファイルにシンボリックリンクを作成。存在するディレクトリにシンボリックリンクを作成を行うプログラムです。

◆実行結果(Windows)

実行結果の説明存在するファイル、存在しないファイル、存在するディレクトリの全てにシンボリックリンクが作成されました。

存在しないファイルを後から作成しても、シンボリックリンクは正常に動作しました。

存在しないリンク先を後からディレクトリ作成した場合は、シンボリックリンクは動作しませんでした。

◆実行結果(Linux)

実行結果の説明Windowsと同じで、存在するファイル、存在しないファイル、存在するディレクトリの全てにシンボリックリンクが作成されました。

存在しないファイルを後から作成しても、シンボリックリンクは正常に動作しました。この動きもWindowsと同じです。

存在しないリンク先を後からディレクトリ作成した場合も、シンボリックリンクは正常に動作しました。Windowsと異なる動きです。

広告の下に続きます。

TempDir関数

func TempDir() string

関数の説明 TempDir は、一時ファイルに使用する既定のディレクトリを返します。

Unix システムでは、空でない場合は $TMPDIR を返し、空でない場合は /tmp を返します。 Windows では、GetTempPath を使用して、%TMP%、%TEMP%、%USERPROFILE%、または Windows ディレクトリから最初の空でない値を返します。 Plan 9 では、/tmp を返します。

ディレクトリの存在は保証されておらず、アクセス許可もありません。

◆テストコード

package main

import (
    "fmt"
    "os"
)

func main() {
    fmt.Printf("TempDir=[%s]\n", os.TempDir())
}

コードの説明 os.TempDir()関数の結果を表示するプログラムです。

◆実行結果(Windows)

実行結果の説明GetTempPath の値が表示されました。

Truncate関数

func Truncate(name string, size int64) error

関数の説明 Truncate は、指定されたファイルのサイズを変更します。ファイルがシンボリック リンクの場合、リンクのターゲットのサイズが変更されます。エラーがある場合、タイプは *PathError になります。

◆テストコード

package main

import (
    "fmt"
    "os"
)

func ps(fileName string) {
    f, e := os.Open(fileName)
    if e != nil {
        fmt.Fprintf(os.Stderr, "%v\n", os.NewSyscallError("os.Open", e))
        return
    }
    fi, e2 := f.Stat()
    if e2 != nil {
        fmt.Fprintf(os.Stderr, "%v\n", os.NewSyscallError("os.Stat", e))
        return
    }
    fmt.Printf("size=[%d]\n", fi.Size())
}

func sl(old, new string) {
    e := os.Symlink(old, new)
    if e != nil {
        fmt.Fprintf(os.Stderr, "%v\n", os.NewSyscallError("os.Symlink", e))
        return
    }
}

func tc(filename string, size int64) {
    e := os.Truncate(filename, size)
    if e != nil {
        fmt.Fprintf(os.Stderr, "%v\n", os.NewSyscallError("os.Truncate", e))
        return
    }
}

func main() {
    tc("truntest", 64)
    ps("truntest")

    tc("truntest", 32)
    ps("truntest")

    sl("truntest", "truntest-s")
    tc("truntest-s", 128)
    ps("truntest")
}

コードの説明存在しないファイルのファイルサイズ変更、存在するファイルのファイルサイズ変更、シンボリックファイルのファイルサイズ変更を行い、それぞれのファイルサイズを表示するプログラムです。

◆実行結果(Windows)

実行結果の説明

  • 1行目:ファイルが存在しませんでしたが、新規に64バイトでファイルが作成されました。
  • 2行目:64バイトのファイルが32バイトに変更されました。
  • 3行目:シンボリックリンクを指定しましたが、リンク元のファイルが128バイトに変更されました。

最後までご覧いただきありがとうございます