Documentation
¶
Overview ¶
fsパッケージはファイルシステムへの基本的なインターフェースを定義します。 ファイルシステムはホストオペレーティングシステムだけでなく、他のパッケージによっても提供されることがあります。
ファイルシステムの実装のテストを支援するための testing/fstest パッケージを参照してください。
Index ¶
- Variables
- func FormatDirEntry(dir DirEntry) string
- func FormatFileInfo(info FileInfo) string
- func Glob(fsys FS, pattern string) (matches []string, err error)
- func ReadFile(fsys FS, name string) ([]byte, error)
- func ReadLink(fsys FS, name string) (string, error)
- func ValidPath(name string) bool
- func WalkDir(fsys FS, root string, fn WalkDirFunc) error
- type DirEntry
- type FS
- type File
- type FileInfo
- type FileMode
- type GlobFS
- type PathError
- type ReadDirFS
- type ReadDirFile
- type ReadFileFS
- type ReadLinkFS
- type StatFS
- type SubFS
- type WalkDirFunc
Examples ¶
Constants ¶
This section is empty.
Variables ¶
var ( ErrInvalid = errInvalid() ErrPermission = errPermission() ErrExist = errExist() ErrNotExist = errNotExist() ErrClosed = errClosed() )
汎用ファイルシステムのエラー。 ファイルシステムから返されるエラーは、これらのエラーと比較してテストすることができます errors.Is を使用して。
var SkipAll = errors.New("skip everything and stop the walk")
SkipAllは、WalkDirFunc からの戻り値として使用され、 残りのすべてのファイルとディレクトリをスキップすることを示します。 これはどの関数からもエラーとして返されません。
var SkipDir = errors.New("skip this directory")
SkipDirは、WalkDirFunc からの戻り値として使用され、 呼び出しで名前が付けられたディレクトリをスキップすることを示します。 これはどの関数からもエラーとして返されません。
Functions ¶
func FormatDirEntry ¶ added in v1.21.0
FormatDirEntry は dir の人間が読みやすい形式のフォーマット済みバージョンを返します。 DirEntry の実装は、これを String メソッドから呼び出すことができます。 名前が subdir のディレクトリと名前が hello.go のファイルの出力は次の通りです:
d subdir/ - hello.go
func FormatFileInfo ¶ added in v1.21.0
FormatFileInfoは、人間が読みやすい形式に整形されたinfoのバージョンを返します。 FileInfo の実装は、Stringメソッドからこれを呼び出すことができます。 "hello.go"という名前のファイル、100バイト、モード0o644、作成日時は1970年1月1日の正午の場合、出力は次のようになります。
-rw-r--r-- 100 1970-01-01 12:00:00 hello.go
func Glob ¶
Globは、パターンに一致するすべてのファイルの名前を返します。一致するファイルがない場合はnilを返します。 パターンの構文は path.Match と同じです。パターンはusr/*/bin/edのような階層的な名前を指定することができます。
Globは、ディレクトリの読み取り時のI/Oエラーなどのファイルシステムのエラーを無視します。 返される唯一の可能なエラーは、 path.ErrBadPattern で、パターンが不正であることを報告します。
もしfsが GlobFS を実装している場合、Globはfs.Globを呼び出します。 そうでない場合、Globは ReadDir を使用してディレクトリツリーをトラバースし、パターンに一致するものを探します。
Example ¶
package main
import (
"github.com/shogo82148/std/fmt"
"github.com/shogo82148/std/io/fs"
"github.com/shogo82148/std/log"
"github.com/shogo82148/std/testing/fstest"
)
func main() {
fsys := fstest.MapFS{
"file.txt": {},
"file.go": {},
"dir/file.txt": {},
"dir/file.go": {},
"dir/subdir/x.go": {},
}
patterns := []string{
"*.txt",
"*.go",
"dir/*.go",
"dir/*/x.go",
}
for _, pattern := range patterns {
matches, err := fs.Glob(fsys, pattern)
if err != nil {
log.Fatal(err)
}
fmt.Printf("%q matches: %v\n", pattern, matches)
}
}
Output: "*.txt" matches: [file.txt] "*.go" matches: [file.go] "dir/*.go" matches: [dir/file.go] "dir/*/x.go" matches: [dir/subdir/x.go]
func ReadFile ¶
ReadFileはファイルシステムfsから指定された名前のファイルを読み込み、その内容を返します。 成功した呼び出しはnilのエラーを返しますが、io.EOF ではありません。 (ReadFileはファイル全体を読み込むため、最後のReadでの予想されるEOFはエラーとして報告されません。)
もしfsが ReadFileFS を実装している場合、ReadFileはfs.ReadFileを呼び出します。 そうでなければ、ReadFileはfs.Openを呼び出し、返された File に対してReadとCloseを使用します。
Example ¶
package main
import (
"github.com/shogo82148/std/fmt"
"github.com/shogo82148/std/io/fs"
"github.com/shogo82148/std/log"
"github.com/shogo82148/std/testing/fstest"
)
func main() {
fsys := fstest.MapFS{
"hello.txt": {
Data: []byte("Hello, World!\n"),
},
}
data, err := fs.ReadFile(fsys, "hello.txt")
if err != nil {
log.Fatal(err)
}
fmt.Print(string(data))
}
Output: Hello, World!
func ReadLink ¶ added in v1.25.0
ReadLink returns the destination of the named symbolic link.
If fsys does not implement ReadLinkFS, then ReadLink returns an error.
func ValidPath ¶
ValidPathは与えられたパス名がOpenの呼び出しに使用するために有効かどうかを報告します。
openに渡されるパス名は、UTF-8エンコードされた、 ルートを持たない、スラッシュで区切られたパス要素のシーケンスです。例:"x/y/z"。 パス名には"."や".."または空文字列の要素を含んではいけません。 ただし、特別なケースとして、ルートディレクトリには"."という名前を使用できます。 パスはスラッシュで始まったり終わったりしてはいけません:"/x"や"x/"は無効です。
なお、パスは全てのシステムでスラッシュで区切られます(Windowsでも)。 バックスラッシュやコロンなどの他の文字を含むパスも有効ですが、これらの文字は FS の実装によっては絶対にパス要素の区切りとして解釈されるべきではありません。
Example ¶
package main
import (
"github.com/shogo82148/std/fmt"
"github.com/shogo82148/std/io/fs"
)
func main() {
paths := []string{
".",
"x",
"x/y/z",
"",
"..",
"/x",
"x/",
"x//y",
"x/./y",
"x/../y",
}
for _, path := range paths {
fmt.Printf("ValidPath(%q) = %t\n", path, fs.ValidPath(path))
}
}
Output: ValidPath(".") = true ValidPath("x") = true ValidPath("x/y/z") = true ValidPath("") = false ValidPath("..") = false ValidPath("/x") = false ValidPath("x/") = false ValidPath("x//y") = false ValidPath("x/./y") = false ValidPath("x/../y") = false
func WalkDir ¶
func WalkDir(fsys FS, root string, fn WalkDirFunc) error
WalkDirはルートにルートされたファイルツリーを走査し、各ファイルまたはディレクトリに対してfnを呼び出します。
ファイルとディレクトリを訪れる中で発生するエラーは、fnによってフィルタリングされます: 詳細については、fs.WalkDirFunc のドキュメントを参照してください。
ファイルは辞書式順に走査されますが、出力を決定論的にするために、WalkDirはディレクトリ全体をメモリに読み込んでから、そのディレクトリを走査する必要があります。
WalkDirはディレクトリ内で見つかったシンボリックリンクをたどりませんが、ルート自体がシンボリックリンクであれば、その対象が走査されます。
Example ¶
package main
import (
"github.com/shogo82148/std/fmt"
"github.com/shogo82148/std/io/fs"
"github.com/shogo82148/std/log"
"github.com/shogo82148/std/os"
)
func main() {
root := "/usr/local/go/bin"
fileSystem := os.DirFS(root)
fs.WalkDir(fileSystem, ".", func(path string, d fs.DirEntry, err error) error {
if err != nil {
log.Fatal(err)
}
fmt.Println(path)
return nil
})
}
Output:
Types ¶
type DirEntry ¶
DirEntryはディレクトリから読み取られたエントリです (ReadDir 関数や ReadDirFile のReadDirメソッドを使用して)。
func FileInfoToDirEntry ¶ added in v1.17.0
FileInfoToDirEntryは、infoから情報を返す DirEntry を返します。 もしinfoがnilの場合、FileInfoToDirEntryはnilを返します。
type FS ¶
FSは階層的なファイルシステムへのアクセスを提供します。
FSインターフェースはファイルシステムに必要な最小限の実装です。 ファイルシステムは追加のインターフェース、例えば ReadFileFS を実装することができます。 追加の機能や最適化された機能を提供することができます。
testing/fstest.TestFS は、FSの実装の正確さをテストするために使用できます。
func Sub ¶
Subはfsysのdirでルートされた部分木に対応する FS を返します。
dirが"."の場合、Subはfsysを変更せずに返します。 そうでなければ、fsが SubFS を実装している場合、Subはfsys.Sub(dir)を返します。 そうでなければ、Subは新しい FS 実装subを返します。これは 実質的にsub.Open(name)をfsys.Open(path.Join(dir, name))として実装します。 この実装はまた、ReadDir、ReadFile、 ReadLink、Lstat、およびGlobの呼び出しも適切に変換します。
os.DirFS("/prefix")とSub(os.DirFS("/"), "prefix")は同等であることに注意してください。 どちらも、"/prefix"の外部にあるオペレーティングシステムのアクセスを回避することを保証するものではありません。 なぜなら、 os.DirFS の実装は、"/prefix"内部の他のディレクトリを指すシンボリックリンクをチェックしないためです。 つまり、os.DirFSはchrootスタイルのセキュリティメカニズムの一般的な代替手段ではなく、Subもその事実を変えません。
type File ¶
Fileは単一のファイルへのアクセスを提供します。 Fileインターフェースはファイルに必要な最小限の実装です。 ディレクトリファイルは ReadDirFile も実装する必要があります。 ファイルは最適化として io.ReaderAt または io.Seeker を実装する場合があります。
type FileInfo ¶
type FileInfo interface {
Name() string
Size() int64
Mode() FileMode
ModTime() time.Time
IsDir() bool
Sys() any
}
FileInfoはファイルを説明し、Stat によって返されます。
type FileMode ¶
type FileMode uint32
FileModeはファイルのモードとパーミッションビットを表します。 ビットの定義はすべてのシステムで同じであるため、 ファイルに関する情報をポータブルに他のシステムに移動することができます。 すべてのビットがすべてのシステムに適用されるわけではありません。 ディレクトリに対しては ModeDir のみが必須です。
const ( // 単一の文字は、Stringメソッドのフォーマットで使用される省略形です。 ModeDir FileMode = 1 << (32 - 1 - iota) ModeAppend ModeExclusive ModeTemporary ModeSymlink ModeDevice ModeNamedPipe ModeSocket ModeSetuid ModeSetgid ModeCharDevice ModeSticky ModeIrregular // タイプビットのマスク。通常のファイルでは、全く設定されません。 ModeType = ModeDir | ModeSymlink | ModeNamedPipe | ModeSocket | ModeDevice | ModeCharDevice | ModeIrregular ModePerm FileMode = 0777 )
定義されたファイルモードビットは、 FileMode の最も重要なビットです。 9つの最も下位のビットは、標準のUnixのrwxrwxrwx権限です。 これらのビットの値は、パブリックAPIの一部と見なされ、 ワイヤープロトコルやディスク表現で使用される可能性があります。 これらのビットは変更しないでくださいが、新しいビットが追加されることはあります。
type ReadDirFile ¶
ReadDirFileは、ReadDirメソッドを使用してエントリを読み取ることができるディレクトリファイルです。 すべてのディレクトリファイルは、このインターフェースを実装する必要があります。 (任意のファイルがこのインターフェースを実装することも許可されていますが、非ディレクトリの場合はReadDirがエラーを返すべきです。)
type ReadFileFS ¶
ReadFileFSは、 ReadFile の最適化された実装を提供するファイルシステムによって実装されるインターフェースです。
type ReadLinkFS ¶ added in v1.25.0
type ReadLinkFS interface {
FS
ReadLink(name string) (string, error)
Lstat(name string) (FileInfo, error)
}
ReadLinkFS is the interface implemented by a file system that supports reading symbolic links.
type WalkDirFunc ¶
WalkDirFuncは WalkDir によって各ファイルやディレクトリを訪れるために呼び出される関数の型です。
path引数には、 WalkDir の引数としてのパスが前置されます。 つまり、root引数が "dir" でWalkDirがそのディレクトリで "a" という名前のファイルを見つけた場合、 引数が "dir/a" であるように歩行関数が呼び出されます。
d引数は、指定されたパスの fs.DirEntry です。
関数によって返されるエラー結果は、 WalkDir の進行方法を制御します。 関数が特別な値 SkipDir を返す場合、WalkDirは現在のディレクトリをスキップします(d.IsDir()がtrueであればパス、 そうでなければパスの親ディレクトリ)。 関数が特別な値 SkipAll を返す場合、WalkDirは残りのすべてのファイルおよびディレクトリをスキップします。 それ以外の場合、関数が非nilのエラーを返す場合、WalkDirは完全に停止し、そのエラーを返します。
エラー引数は、パスに関連するエラーを報告し、WalkDirがそのディレクトリに入ろうとしないことを示します。 関数はそのエラーを処理する方法を決定することができます。 エラーを返すと、WalkDirは木全体のツリーをかけるのをやめます。
WalkDir は、2つのケースで非nilのerr引数を持って関数を呼び出します。
まず、ルートディレクトリの初期 Stat が失敗した場合、WalkDirは関数をpathがrootに設定され、 dがnilに設定され、errが fs.Stat からのエラーに設定された状態で呼び出します。
2番目に、ディレクトリのReadDirメソッド( ReadDirFile を参照)が失敗した場合、WalkDirは関数をディレクトリのパスがpathに設定され、 dがディレクトリを記述する DirEntry に設定され、errがReadDirからのエラーに設定された状態で呼び出します。 この2番目の場合、関数はディレクトリのパスで2回呼び出されます。 最初の呼び出しは、ディレクトリの読み取りが試みられる前で、errがnilに設定されるため、関数に SkipDir または SkipAll を返すチャンスがあり、ReadDirを完全に回避します。 2回目の呼び出しは、失敗したReadDirからのエラーを報告します。 (ReadDirが成功すると、2回目の呼び出しがありません。)
WalkDirFuncと path/filepath.WalkFunc の違いは次のとおりです: