fs

package
v1.21.4 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Nov 2, 2023 License: MIT Imports: 2 Imported by: 0

Documentation

Overview

Package fsはファイルシステムへの基本的なインターフェースを定義します。 ファイルシステムはホストオペレーティングシステムだけでなく、他のパッケージによっても提供されることがあります。

Index

Examples

Constants

This section is empty.

Variables

View Source
var (
	ErrInvalid    = errInvalid()
	ErrPermission = errPermission()
	ErrExist      = errExist()
	ErrNotExist   = errNotExist()
	ErrClosed     = errClosed()
)

汎用ファイルシステムのエラー。 ファイルシステムから返されるエラーは、これらのエラーと比較してテストすることができます errors.Is を使用して。

View Source
var SkipAll = errors.New("skip everything and stop the walk")

SkipAllは、WalkDirFuncsからの返り値として使用され、残りのすべてのファイルとディレクトリをスキップすることを示します。これは、どの関数からもエラーとして返されません。

View Source
var SkipDir = errors.New("skip this directory")

SkipDirはWalkDirFuncsからの戻り値として使用され、呼び出しで指定されたディレクトリがスキップされることを示します。これは、どの関数からもエラーとして返されません。

Functions

func FormatDirEntry added in v1.21.0

func FormatDirEntry(dir DirEntry) string

FormatDirEntry は dir の人間が読みやすい形式のフォーマット済みバージョンを返します。 DirEntry の実装は、これを String メソッドから呼び出すことができます。 名前が subdir のディレクトリと名前が hello.go のファイルの出力は次の通りです:

d subdir/ - hello.go

func FormatFileInfo added in v1.21.0

func FormatFileInfo(info FileInfo) string

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

func Glob(fsys FS, pattern string) (matches []string, err error)

Globは、パターンに一致するすべてのファイルの名前を返します。一致するファイルがない場合はnilを返します。 パターンの構文はpath.Matchと同じです。パターンはusr/*/bin/edのような階層的な名前を指定することができます。

Globは、ディレクトリの読み取り時のI/Oエラーなどのファイルシステムのエラーを無視します。 返される唯一の可能なエラーは、path.ErrBadPatternで、パターンが不正であることを報告します。

もしfsがGlobFSを実装している場合、Globはfs.Globを呼び出します。 そうでない場合、Globはディレクトリツリーをトラバースし、パターンに一致するものを探します。

func ReadFile

func ReadFile(fsys FS, name string) ([]byte, error)

ReadFileはファイルシステムfsから指定された名前のファイルを読み込み、その内容を返します。 成功した呼び出しはnilのエラーを返しますが、io.EOFではありません。 (ReadFileはファイル全体を読み込むため、最後のReadでの予想されるEOFはエラーとして報告されません。)

もしfsがReadFileFSを実装している場合、ReadFileはfs.ReadFileを呼び出します。 そうでなければ、ReadFileはfs.Openを呼び出し、返されたファイルに対してReadとCloseを使用します。

func ValidPath

func ValidPath(name string) bool

ValidPathは与えられたパス名がOpenの呼び出しに使用するために有効かどうかを報告します。

Openに渡されるパス名はUTF-8でエンコードされた、ルートなしのスラッシュで区切られたパス要素のシーケンス(例: "x/y/z")です。 パス名には、"."または".."または空の文字列を含めることはできませんが、ルートディレクトリが "."という特殊なケースを除いてはです。 パスはスラッシュで始まることや終わることはできません: "/x"や"x/"は無効です。

なお、パスは全てのシステムでスラッシュで区切られます(Windowsでも)。 バックスラッシュやコロンなどの他の文字を含むパスも有効ですが、これらの文字は実装によっては絶対にパス要素の区切りとして解釈されるべきではありません。

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

type DirEntry interface {
	// Name returns the name of the file (or subdirectory) described by the entry.
	// This name is only the final element of the path (the base name), not the entire path.
	// For example, Name would return "hello.go" not "home/gopher/hello.go".
	Name() string

	// IsDir reports whether the entry describes a directory.
	IsDir() bool

	// Type returns the type bits for the entry.
	// The type bits are a subset of the usual FileMode bits, those returned by the FileMode.Type method.
	Type() FileMode

	// Info returns the FileInfo for the file or subdirectory described by the entry.
	// The returned FileInfo may be from the time of the original directory read
	// or from the time of the call to Info. If the file has been removed or renamed
	// since the directory read, Info may return an error satisfying errors.Is(err, ErrNotExist).
	// If the entry denotes a symbolic link, Info reports the information about the link itself,
	// not the link's target.
	Info() (FileInfo, error)
}

DirEntryはディレクトリから読み取られたエントリです (ReadDir関数やReadDirFileのReadDirメソッドを使用して)。

func FileInfoToDirEntry added in v1.17.0

func FileInfoToDirEntry(info FileInfo) DirEntry

FileInfoToDirEntryは、infoから情報を返すDirEntryを返します。 もしinfoがnilの場合、FileInfoToDirEntryはnilを返します。

func ReadDir

func ReadDir(fsys FS, name string) ([]DirEntry, error)

ReadDirは指定されたディレクトリを読み取り、 ファイル名でソートされたディレクトリエントリのリストを返します。

fsがReadDirFSを実装している場合、ReadDirはfs.ReadDirを呼び出します。 そうでない場合、ReadDirはfs.Openを呼び出し、返されたファイルでReadDirとCloseを使用します。

type FS

type FS interface {
	// Open opens the named file.
	//
	// When Open returns an error, it should be of type *PathError
	// with the Op field set to "open", the Path field set to name,
	// and the Err field describing the problem.
	//
	// Open should reject attempts to open names that do not satisfy
	// ValidPath(name), returning a *PathError with Err set to
	// ErrInvalid or ErrNotExist.
	Open(name string) (File, error)
}

FSは階層的なファイルシステムへのアクセスを提供します。

FSインターフェースはファイルシステムに必要な最小限の実装です。 ファイルシステムは追加のインターフェース、例えばReadFileFSを実装することができます。 追加の機能や最適化された機能を提供することができます。

func Sub

func Sub(fsys FS, dir string) (FS, error)

Subはfsysのdirでルートされた部分木に対応するFSを返します。

dirが"."の場合、Subはfsysを変更せずに返します。 そうでない場合、fsがSubFSを実装している場合、Subはfsys.Sub(dir)を返します。 そうでない場合、Subは効果的に、sub.Open(name)をfsys.Open(path.Join(dir, name))として実装する新しいFS実装subを返します。 実装では、ReadDir、ReadFile、そしてGlobへの呼び出しも適切に変換されます。

os.DirFS("/prefix")とSub(os.DirFS("/"), "prefix")は同等であることに注意してください。 どちらも、"/prefix"の外部にあるオペレーティングシステムのアクセスを回避することを保証するものではありません。 なぜなら、os.DirFSの実装は、"/prefix"内部の他のディレクトリを指すシンボリックリンクをチェックしないためです。 つまり、os.DirFSはchrootスタイルのセキュリティメカニズムの一般的な代替手段ではなく、Subもその事実を変えません。

type File

type File interface {
	Stat() (FileInfo, error)
	Read([]byte) (int, error)
	Close() error
}

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によって返されます。

func Stat

func Stat(fsys FS, name string) (FileInfo, error)

Statはファイルシステムから指定されたファイルに関するFileInfoを返します。

もしfsがStatFSを実装している場合、Statはfs.Statを呼び出します。 そうでない場合、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の一部と見なされ、 ワイヤープロトコルやディスク表現で使用される可能性があります。 これらのビットは変更しないでくださいが、新しいビットが追加されることはあります。

func (FileMode) IsDir

func (m FileMode) IsDir() bool

IsDirはmがディレクトリを記述しているかどうかを報告します。 つまり、m内のModeDirビットがセットされているかどうかをテストします。

func (FileMode) IsRegular

func (m FileMode) IsRegular() bool

IsRegularはmが正規のファイルを記述しているかどうかを報告します。 つまり、モードのタイプビットが設定されていないかどうかをテストします。

func (FileMode) Perm

func (m FileMode) Perm() FileMode

Permは、m(m&ModePerm)のUnixパーミッションビットを返します。

func (FileMode) String

func (m FileMode) String() string

func (FileMode) Type

func (m FileMode) Type() FileMode

Typeはm(m&ModeType)のタイプビットを返します。

type GlobFS

type GlobFS interface {
	FS

	// Glob returns the names of all files matching pattern,
	// providing an implementation of the top-level
	// Glob function.
	Glob(pattern string) ([]string, error)
}

GlobFSはGlobメソッドを持つファイルシステムです。

type PathError

type PathError struct {
	Op   string
	Path string
	Err  error
}

PathErrorはエラーとそれを引き起こした操作とファイルパスを記録します。

func (*PathError) Error

func (e *PathError) Error() string

func (*PathError) Timeout

func (e *PathError) Timeout() bool

Timeoutは、このエラーがタイムアウトを示すかどうかを報告します。

func (*PathError) Unwrap

func (e *PathError) Unwrap() error

type ReadDirFS

type ReadDirFS interface {
	FS

	// ReadDir reads the named directory
	// and returns a list of directory entries sorted by filename.
	ReadDir(name string) ([]DirEntry, error)
}

ReadDirFSは、ReadDirの最適化された実装を提供するファイルシステムで実装されるインターフェースです。

type ReadDirFile

type ReadDirFile interface {
	File

	// ReadDir reads the contents of the directory and returns
	// a slice of up to n DirEntry values in directory order.
	// Subsequent calls on the same file will yield further DirEntry values.
	//
	// If n > 0, ReadDir returns at most n DirEntry structures.
	// In this case, if ReadDir returns an empty slice, it will return
	// a non-nil error explaining why.
	// At the end of a directory, the error is io.EOF.
	// (ReadDir must return io.EOF itself, not an error wrapping io.EOF.)
	//
	// If n <= 0, ReadDir returns all the DirEntry values from the directory
	// in a single slice. In this case, if ReadDir succeeds (reads all the way
	// to the end of the directory), it returns the slice and a nil error.
	// If it encounters an error before the end of the directory,
	// ReadDir returns the DirEntry list read until that point and a non-nil error.
	ReadDir(n int) ([]DirEntry, error)
}

ReadDirFileは、ReadDirメソッドを使用してエントリを読み取ることができるディレクトリファイルです。 すべてのディレクトリファイルは、このインターフェースを実装する必要があります。 (任意のファイルがこのインターフェースを実装することも許可されていますが、非ディレクトリの場合はReadDirがエラーを返すべきです。)

type ReadFileFS

type ReadFileFS interface {
	FS

	// ReadFile reads the named file and returns its contents.
	// A successful call returns a nil error, not io.EOF.
	// (Because ReadFile reads the whole file, the expected EOF
	// from the final Read is not treated as an error to be reported.)
	//
	// The caller is permitted to modify the returned byte slice.
	// This method should return a copy of the underlying data.
	ReadFile(name string) ([]byte, error)
}

ReadFileFSは、ReadFileの最適化された実装を提供するファイルシステムによって実装されるインターフェースです。

type StatFS

type StatFS interface {
	FS

	// Stat returns a FileInfo describing the file.
	// If there is an error, it should be of type *PathError.
	Stat(name string) (FileInfo, error)
}

StatFSは、Statメソッドを持つファイルシステムです。

type SubFS

type SubFS interface {
	FS

	// Sub returns an FS corresponding to the subtree rooted at dir.
	Sub(dir string) (FS, error)
}

SubFSはSubメソッドを持つファイルシステムです。

type WalkDirFunc

type WalkDirFunc func(path string, d DirEntry, err error) error

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引数を持って関数を呼び出します。

まず、ルートディレクトリの初期fs.Statが失敗した場合、WalkDirは関数をpathがrootに設定され、 dがnilに設定され、errがfs.Statからのエラーに設定された状態で呼び出します。

2番目に、ディレクトリのReadDirメソッドが失敗した場合、WalkDirは関数をディレクトリのパスがpathに設定され、 dがディレクトリを記述するfs.DirEntryに設定され、errがReadDirからのエラーに設定された状態で呼び出します。 この2番目の場合、関数はディレクトリのパスで2回呼び出されます。 最初の呼び出しは、ディレクトリの読み取りが試みられる前で、errがnilに設定されるため、関数にSkipDirまたはSkipAllを返すチャンスがあり、ReadDirを完全に回避します。 2回目の呼び出しは、失敗したReadDirからのエラーを報告します。 (ReadDirが成功すると、2回目の呼び出しがありません。)

WalkDirFuncとfilepath.WalkFuncの違いは次のとおりです:

  • 2番目の引数の型がfs.DirEntryであること。
  • ディレクトリを読み取る前に関数が呼び出され、SkipDirまたはSkipAllがディレクトリの読み取りを完全にバイパスしたり、 残りのすべてのファイルとディレクトリをスキップしたりするようにすること。
  • ディレクトリの読み取りが失敗した場合、そのディレクトリについてのエラーを報告するために、関数が2回呼び出されること。

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL