...

パッケージ filepath

import "path/filepath"
概要
目次

概要 ▾

filepath パッケージは,対象 OS のファイルパスに互換性のある仕方で,ファイル名パスを操作する便利関数を実装します。

filepath パッケージは,オペレーティングシステムに応じて,スラッシュまたはバックスラッシュを使用します。 オペレーティングシステムに関係なく常にスラッシュを使用する URL などのパスを処理するには,path パッケージを参照してください。

定数

const (
    Separator     = os.PathSeparator
    ListSeparator = os.PathListSeparator
)

変数

ErrBadPattern は,パターンが不正な形式であることを示します。

var ErrBadPattern = errors.New("syntax error in pattern")

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

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

func Abs

func Abs(path string) (string, error)

Abs は path の絶対パスを返します。 path が絶対パスでない場合は,現在の作業ディレクトリと結合されて絶対パスに変換されます。 ファイルの絶対パス名が一意であるとは限りません。 Abs は結果について Clean を呼び出します。

func Base

func Base(path string) string

Base は path の最後の要素を返します。 末尾のパス区切り文字を取り除いてから,最後の要素を抽出します。 path が空の場合, Base は "." を返します。 path が完全に区切り文字で構成されている場合, Base は 1 つの区切り文字を返します。

コード:

fmt.Println("On Unix:")
fmt.Println(filepath.Base("/foo/bar/baz.js"))
fmt.Println(filepath.Base("/foo/bar/baz"))
fmt.Println(filepath.Base("/foo/bar/baz/"))
fmt.Println(filepath.Base("dev.txt"))
fmt.Println(filepath.Base("../todo.txt"))
fmt.Println(filepath.Base(".."))
fmt.Println(filepath.Base("."))
fmt.Println(filepath.Base("/"))
fmt.Println(filepath.Base(""))

出力:

On Unix:
baz.js
baz
baz
dev.txt
todo.txt
..
.
/
.

func Clean

func Clean(path string) string

Clean は純粋な語彙処理によって path と等価な最短パス名を返します。 それ以上処理ができなくなるまで,以下の規則を繰り返し適用します。

1. 複数のスラッシュを 1 つのスラッシュに置き換える。
2. . パス名を削除する (カレントディレクトリ)
3. 内部の .. パス名とその前にある .. でない要素を削除する (親ディレクトリ)
4. ルートパスで始まる .. 要素を削除する。
   つまり,パスの最初の "/.." を "/" で置換する。

返されたパスは, UNIX の場合は "/" , Windows の場合は `C:\` のように,ルートディレクトリを表す場合にのみスラッシュで終わります。

最後に,スラッシュは Separator に置き換えられます。

このプロセスの結果が空の文字列の場合, Clean は文字列 "." を返します。

RobPike, "Plan9 のレキシカルファイル名またはドットドットを正しく扱う" (https://9p.io/sys/doc/lexnames.html) も参照してください。

func Dir

func Dir(path string) string

Dir は,path の最後の要素 (通常はパスのディレクトリ) を除くすべての要素を返します。 最後の要素を削除した後, Dir は path に対して Clean を呼び出し,末尾のスラッシュは削除されます。 path が空の場合, Dir は "." を返します。 path が完全に区切り文字で構成されている場合, Dir は 1 つの区切り文字を返します。 ルートディレクトリでない限り,返されるパスは区切り文字で終わりません。

コード:

fmt.Println("On Unix:")
fmt.Println(filepath.Dir("/foo/bar/baz.js"))
fmt.Println(filepath.Dir("/foo/bar/baz"))
fmt.Println(filepath.Dir("/foo/bar/baz/"))
fmt.Println(filepath.Dir("/dirty//path///"))
fmt.Println(filepath.Dir("dev.txt"))
fmt.Println(filepath.Dir("../todo.txt"))
fmt.Println(filepath.Dir(".."))
fmt.Println(filepath.Dir("."))
fmt.Println(filepath.Dir("/"))
fmt.Println(filepath.Dir(""))

出力:

On Unix:
/foo/bar
/foo/bar
/foo/bar/baz
/dirty/path
.
..
.
.
/
.
func EvalSymlinks(path string) (string, error)

EvalSymlinks はシンボリックリンクを評価した後のパス名を返します。 path が相対パスの場合,コンポーネントの 1 つが絶対シンボリックリンクでない限り, 結果は現在のディレクトリからの相対パスになります。 EvalSymlinks は結果に対して Clean を呼び出します。

func Ext

func Ext(path string) string

Ext (拡張子) は,path で使用されているファイル名拡張子を返します。 拡張子は,path のスラッシュで区切られた最後の要素の最後のドットから始まるサフィックスです。 ドットがない場合は空です。

コード:

fmt.Printf("No dots: %q\n", filepath.Ext("index"))
fmt.Printf("One dot: %q\n", filepath.Ext("index.js"))
fmt.Printf("Two dots: %q\n", filepath.Ext("main.test.js"))

出力:

No dots: ""
One dot: ".js"
Two dots: ".js"

func FromSlash

func FromSlash(path string) string

FromSlash は,パス内の各スラッシュ ('/') 文字を区切り文字に置き換えた結果を返します。 複数のスラッシュは複数の区切り文字に置き換えられます。

func Glob

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

Glob は pattern にマッチする全てのファイルの名前を返すか,もしマッチするファイルがなければ nil を返します。 pattern の構文は Match と同じです。 pattern は (区切り文字が '/' であると仮定して) /usr/*/bin/ed のような階層名を記述することができます。

Glob は,ディレクトリ読み取り中の I/O エラーなどのファイルシステムエラーを無視します。 返される可能性がある唯一のエラーは ErrBadPattern です。 それは,pattern が不正な形式の場合です。

func HasPrefix

func HasPrefix(p, prefix string) bool

HasPrefix は過去の互換性のために存在しており,使用すべきではありません。

非推奨: HasPrefix はパス境界を考慮せず,必要に応じて大文字と小文字を区別しないことをしません。

func IsAbs

func IsAbs(path string) bool

IsAbs はパスが絶対パスかどうかを報告します。

コード:

fmt.Println("On Unix:")
fmt.Println(filepath.IsAbs("/home/gopher"))
fmt.Println(filepath.IsAbs(".bashrc"))
fmt.Println(filepath.IsAbs(".."))
fmt.Println(filepath.IsAbs("."))
fmt.Println(filepath.IsAbs("/"))
fmt.Println(filepath.IsAbs(""))

出力:

On Unix:
true
false
false
false
true
false

func Join

func Join(elem ...string) string

Join (結合) は,必要に応じて Separator (区切り文字) を追加して,任意の数のパス要素を 1 つのパスに結合します。 返り値は Clean されています。 特に,空の文字列はすべて無視されます。 Windows では,最初のパス要素が UNC パスである場合,またその場合に限り,返り値は UNC パスになります。

コード:

fmt.Println("On Unix:")
fmt.Println(filepath.Join("a", "b", "c"))
fmt.Println(filepath.Join("a", "b/c"))
fmt.Println(filepath.Join("a/b", "c"))
fmt.Println(filepath.Join("a/b", "/c"))

出力:

On Unix:
a/b/c
a/b/c
a/b/c
a/b/c

func Match

func Match(pattern, name string) (matched bool, err error)

Match は, name がシェルファイルの名前パターンと一致するかどうかを報告します。 パターンの構文は次のとおりです。

pattern:
	{ term }
term:
	'*'         区切り文字以外の文字のシーケンスにマッチする
	'?'         区切り文字以外の 1 文字にマッチする
	'[' [ '^' ] { character-range } ']'
	            文字クラス (空であってはいけません)
	c           文字 c にマッチする (c != '*', '?', '\\', '[')
	'\\' c      文字 c にマッチする

character-range:
	c           文字 c にマッチする (c != '\\', '-', ']')
	'\\' c      文字 c にマッチする
	lo '-' hi   lo <= c <= hi の文字 c にマッチする

Match は,pattern が name の部分文字列だけでなく,すべてに一致する必要があります。 返される可能性がある唯一のエラーは ErrBadPattern です。 それは,pattern が不正な形式の場合です。

Windows では,エスケープは無効です。 代わりに, '\\' はパス区切り文字として扱われます。

コード:

fmt.Println("On Unix:")
fmt.Println(filepath.Match("/home/catch/*", "/home/catch/foo"))
fmt.Println(filepath.Match("/home/catch/*", "/home/catch/foo/bar"))
fmt.Println(filepath.Match("/home/?opher", "/home/gopher"))
fmt.Println(filepath.Match("/home/\\*", "/home/*"))

出力:

On Unix:
true <nil>
false <nil>
true <nil>
true <nil>

func Rel

func Rel(basepath, targpath string) (string, error)

Rel は,区切り文字を使用して,basepath と結合したときに,targpath と等しくなる相対パスを返します。 つまり, Join(basepath, Rel(basepath, targpath)) は targpath と等しくなります。 成功すると, basepath と targpath が共通する要素を持たなくても,返されるパスは常に basepath を基準にしたものになります。 targpath を basepath に対して相対的に作成できない場合, または現在の作業ディレクトリが必要な場合は,エラーが返されます。 Rel は結果に対して Clean を呼び出します。

コード:

paths := []string{
    "/a/b/c",
    "/b/c",
    "./b/c",
}
base := "/a"

fmt.Println("On Unix:")
for _, p := range paths {
    rel, err := filepath.Rel(base, p)
    fmt.Printf("%q: %q %v\n", p, rel, err)
}

出力:

On Unix:
"/a/b/c": "b/c" <nil>
"/b/c": "../b/c" <nil>
"./b/c": "" Rel: can't make ./b/c relative to /a

func Split

func Split(path string) (dir, file string)

Split (分割) は,最後の Separator (区切り文字)の直後のパスを分割し,ディレクトリとファイル名に分けます。 パスに Separator がない場合, Split は空の dir と file を path に設定して返します。 返される値は,path = dir+file となります。

コード:

paths := []string{
    "/home/arnie/amelia.jpg",
    "/mnt/photos/",
    "rabbit.jpg",
    "/usr/local//go",
}
fmt.Println("On Unix:")
for _, p := range paths {
    dir, file := filepath.Split(p)
    fmt.Printf("input: %q\n\tdir: %q\n\tfile: %q\n", p, dir, file)
}

出力:

On Unix:
input: "/home/arnie/amelia.jpg"
	dir: "/home/arnie/"
	file: "amelia.jpg"
input: "/mnt/photos/"
	dir: "/mnt/photos/"
	file: ""
input: "rabbit.jpg"
	dir: ""
	file: "rabbit.jpg"
input: "/usr/local//go"
	dir: "/usr/local//"
	file: "go"

func SplitList

func SplitList(path string) []string

SplitList は,通常 PATH または GOPATH 環境変数にある, OS 固有の ListSeparator によって結合されたパスのリストを分割します。 strings.Split とは異なり, SplitList は空の文字列を渡すと空のスライスを返します。

コード:

fmt.Println("On Unix:", filepath.SplitList("/a/b/c:/usr/bin"))

出力:

On Unix: [/a/b/c /usr/bin]

func ToSlash

func ToSlash(path string) string

ToSlash は,パス内の各区切り文字をスラッシュ ('/') 文字に置き換えた結果を返します。 複数の区切り文字は複数のスラッシュに置き換えられます。

func VolumeName

func VolumeName(path string) string

VolumeName は先頭のボリューム名を返します。 "C:\foo\bar" を渡すと, Windows では "C:" を返します。 "\\host\share\foo" を渡すと, "\\host\share" を返します。 他のプラットフォームでは "" を返します。

func Walk

func Walk(root string, walkFn WalkFunc) error

walk はルートをルートとするファイルツリーをたどり,ルートを含むツリー内の各ファイルまたはディレクトリごとに walkFn を呼び出します。 ファイルやディレクトリを訪問する際に発生するすべてのエラーは, walkFn によってフィルタリングされます。 ファイルは字句順に調べられるため,出力は確定的になりますが,非常に大きなディレクトリでは Walk は非効率的になる可能性があります。 散歩はシンボリックリンクをたどらない。

コード:

package filepath_test

import (
    "fmt"
    "io/ioutil"
    "os"
    "path/filepath"
)

func prepareTestDirTree(tree string) (string, error) {
    tmpDir, err := ioutil.TempDir("", "")
    if err != nil {
        return "", fmt.Errorf("error creating temp directory: %v\n", err)
    }

    err = os.MkdirAll(filepath.Join(tmpDir, tree), 0755)
    if err != nil {
        os.RemoveAll(tmpDir)
        return "", err
    }

    return tmpDir, nil
}

func ExampleWalk() {
    tmpDir, err := prepareTestDirTree("dir/to/walk/skip")
    if err != nil {
        fmt.Printf("unable to create test dir tree: %v\n", err)
        return
    }
    defer os.RemoveAll(tmpDir)
    os.Chdir(tmpDir)

    subDirToSkip := "skip"

    fmt.Println("On Unix:")
    err = filepath.Walk(".", func(path string, info os.FileInfo, err error) error {
        if err != nil {
            fmt.Printf("prevent panic by handling failure accessing a path %q: %v\n", path, err)
            return err
        }
        if info.IsDir() && info.Name() == subDirToSkip {
            fmt.Printf("skipping a dir without errors: %+v \n", info.Name())
            return filepath.SkipDir
        }
        fmt.Printf("visited file or dir: %q\n", path)
        return nil
    })
    if err != nil {
        fmt.Printf("error walking the path %q: %v\n", tmpDir, err)
        return
    }
    // Output:
    // On Unix:
    // visited file or dir: "."
    // visited file or dir: "dir"
    // visited file or dir: "dir/to"
    // visited file or dir: "dir/to/walk"
    // skipping a dir without errors: skip
}

type WalkFunc

WalkFunc は, Walk が訪れた各ファイルまたはディレクトリに対して呼び出される関数の型です。 path 引数には,接頭辞として Walk の引数が含まれています。 つまり,ファイル "a" を含むディレクトリである "dir" を指定して Walk を呼び出すと, 引数 "dir/a" で walk 関数が呼び出されます。 info 引数は,path の os.FileInfo です。

path という名前のファイルまたはディレクトリへの訪問で問題が発生した場合は, エラー引数がその問題を説明し,関数がそのエラーの処理方法を決定できます。 (そして Walk はそのディレクトリに降りません) 。 エラーが発生した場合, info 引数は nil になります。 エラーが返されると,処理は停止します。 唯一の例外は,関数が特別な値 SkipDir を返すときです。 この関数がディレクトリで呼び出されたときに SkipDir を返すと, Walk はディレクトリの内容を完全にスキップします。 ディレクトリ以外のファイルでこの関数が呼び出されたときに SkipDir が返されると, Walk は,それを含むディレクトリ内の残りのファイルをスキップします。

type WalkFunc func(path string, info os.FileInfo, err error) error