Skip to content
/ osfs Public

OS fs.FS package for Go.

License

Notifications You must be signed in to change notification settings

l4go/osfs

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Jan 16, 2024
663f6d3 · Jan 16, 2024

History

1 Commit
Jan 16, 2024
Jan 16, 2024
Jan 16, 2024
Jan 16, 2024
Jan 16, 2024
Jan 16, 2024
Jan 16, 2024
Jan 16, 2024
Jan 16, 2024

Repository files navigation

l4go/osfs ライブラリ

OSのファイルシステムを、1つのfs.FSとして提供するライブラリです。
Windowsでも動作するので、OS間でのコード互換性も提供します。

標準ライブラリの問題

以下のコードは、Unix系OSではすべてのファイルにアクセスできるfs.FSとして動きますが、Windowsの絶対パスにはドライブ名が必要なので、そのようには動きません。

os_root := os.DirFS("/")

Unix系OSでのos.DirFS("/")相当の機能を、Windowsでも実現できるようしたのが、このライブラリのosfs.OsRootFSです。

使い方

使い方は以下の通り。

os_root := osfs.OsRootFS

os.DirFS()のように、作成時にディレクトリは指定できません。
サブディレクトリをfs.FSに変換したいときは、fs.Sub()を利用してください。

ドライブ名(ドライブレター)の扱い

osfs.OsRootFSでは、ルートディレクトリは、有効なドライブをサブディレクトリとして見える仮想的なディレクトリとして動作します。
WindowsのUNCパス(\\で始まるパス)のドライブには対応していません。

サンプルコード

以下のコードをWindowsで実行すると、現在有効なドライブ名をリストアップします。

func main() {
	rf, err := osfs.OsRootFS.Open(".")
	if err != nil {
		return
	}
	defer rf.Close()

	rdf, ok := rf.(fs.ReadDirFile)
	if !ok {
		fmt.Println(err)
		return
	}

	dent, err := rdf.ReadDir(-1)
	if err != nil {
		fmt.Println(err)
		return
	}
	for _, d := range dent {
        fmt.Println(d.Name())
	}
}