github.com/shogo82148/std@v1.22.1-0.20240327122250-4e474527810c/path/filepath/path.go (about) 1 // Copyright 2009 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 // Package filepathは、ファイル名パスを操作するためのユーティリティ関数を実装しています。 6 // これは、対象のオペレーティングシステムで定義されたファイルパスと互換性のある方法で行います。 7 // 8 // filepathパッケージは、オペレーティングシステムに応じてスラッシュまたはバックスラッシュを使用します。 9 // オペレーティングシステムに関係なく常にスラッシュを使用するURLのようなパスを処理するには、[path]パッケージを参照してください。 10 package filepath 11 12 import ( 13 "github.com/shogo82148/std/io/fs" 14 "github.com/shogo82148/std/os" 15 ) 16 17 const ( 18 Separator = os.PathSeparator 19 ListSeparator = os.PathListSeparator 20 ) 21 22 // Cleanは、純粋な字句解析によってパスに相当する最短のパス名を返します。 23 // 次の規則を適用し、処理できなくなるまで反復的に行います。 24 // 25 // 1. 複数の [Separator] 要素を単一の要素に置き換える。 26 // 2. 各「.」パス名要素(カレントディレクトリ)を削除する。 27 // 3. 各内部の「..」パス名要素(親ディレクトリ)を削除し、それに続く非「..」要素も削除する。 28 // 4. ルートパスで始まる「..」要素を削除する: 29 // つまり、パスの先頭で "/.." を "/" に置き換える(セパレータが '/' であると仮定)。 30 // 31 // 返されるパスは、ルートディレクトリを表す場合のみスラッシュで終わります。 32 // 例:Unixでは "/"、Windowsでは `C:\` などです。 33 // 34 // 最後に、スラッシュの出現箇所はセパレータに置き換えられます。 35 // 36 // この処理の結果が空の文字列の場合、Cleanは文字列 "." を返します。 37 // 38 // Windowsでは、Cleanは"/"を `\` に置き換える以外では、ボリューム名を変更しません。 39 // 例えば、Clean("//host/share/../x") は `\\host\share\x` を返します。 40 // 41 // 参考資料:Rob Pike, "Lexical File Names in Plan 9 or Getting Dot-Dot Right" 42 // https://9p.io/sys/doc/lexnames.html 43 func Clean(path string) string 44 45 // IsLocalは、パスが次の条件をすべて満たすかどうかを報告します。 46 // - パスが評価されるディレクトリをルートとするサブツリー内にある 47 // - 絶対パスではない 48 // - 空ではない 49 // - Windowsの場合、"NUL"のような予約済みの名前ではない 50 // IsLocal(path)がtrueを返す場合、 51 // Join(base, path)は常にbase内に含まれるパスを生成し、 52 // Clean(path)は常に".."パス要素を持たないルート付きのパスを生成します。 53 // IsLocalは純粋に文字解析の操作です。 54 // 特に、ファイルシステムに存在する可能性のあるシンボリックリンクの影響は考慮されません。 55 func IsLocal(path string) bool 56 57 // Localizeは、スラッシュ区切りのパスをオペレーティングシステムのパスに変換します。 58 // 入力パスは、[io/fs.ValidPath] によって報告される有効なパスでなければなりません。 59 // 60 // Localizeは、パスがオペレーティングシステムによって表現できない場合にエラーを返します。 61 // 例えば、Windowsではパスa\bは拒否されます。これは、\がセパレータ文字であり、 62 // ファイル名の一部にはなり得ないからです。 63 // 64 // Localizeによって返されるパスは、IsLocalによって報告されるように、常にローカルになります。 65 func Localize(path string) (string, error) 66 67 // ToSlashは、パス内の各区切り文字をスラッシュ('/')文字で置き換えた結果を返します。複数の区切り文字は複数のスラッシュに置き換えられます。 68 func ToSlash(path string) string 69 70 // FromSlashは、パス内の各スラッシュ('/')文字をセパレータ文字に置き換えた結果を返します。 71 // 複数のスラッシュは複数のセパレータに置き換えられます。 72 // 73 // io/fsパッケージで使用されるスラッシュ区切りのパスをオペレーティングシステムのパスに変換する 74 // Localize関数も参照してください。 75 func FromSlash(path string) string 76 77 // SplitListは、OS固有の [ListSeparator] で結合されたパスのリストを分割します。 78 // 通常、 PATHまたはGOPATH環境変数で見つかることがあります。 79 // strings.Splitとは異なり、SplitListは空のスライスを返します。 80 // 空の文字列が渡された場合。 81 func SplitList(path string) []string 82 83 // Splitは最後の [Separator] の直後にあるパスを分割し、ディレクトリとファイル名の要素に分けます。 84 // パスにSeparatorがない場合、Splitは空のディレクトリとファイルを返します。 85 // 返される値は path = dir + file という性質を持ちます。 86 func Split(path string) (dir, file string) 87 88 // Joinは、パスの要素をいくつでも指定して、OS固有の [Separator] で区切って1つのパスに結合します。空の要素は無視されます。結果はクリーニングされます。ただし、引数リストが空であるか、そのすべての要素が空の場合、Joinは空の文字列を返します。 89 // Windowsでは、最初の非空要素がUNCパスである場合にのみ結果はUNCパスになります。 90 func Join(elem ...string) string 91 92 // Extはpathで使用されるファイル名の拡張子を返します。 93 // 拡張子とは、pathの最後の要素の最後のドットから始まる接尾辞であり、 94 // ドットがない場合は空です。 95 func Ext(path string) string 96 97 // EvalSymlinksは、シンボリックリンクの評価後のパス名を返します。 98 // pathが相対パスの場合、結果は現在のディレクトリを基準にし、 99 // 絶対シンボリックリンクを持つコンポーネントが存在する場合を除きます。 100 // EvalSymlinksは結果に対して [Clean] を呼び出します。 101 func EvalSymlinks(path string) (string, error) 102 103 // Absはパスの絶対表現を返します。 104 // パスが絶対でない場合、現在の作業ディレクトリと結合して絶対パスに変換されます。 105 // 特定のファイルの絶対パス名が一意であることは保証されません。 106 // Absは結果に [Clean] を呼び出します。 107 func Abs(path string) (string, error) 108 109 // Relは、中間のセパレーターでbasepathと結合したときにtargpathと同等の相対パスを返します。 110 // つまり、[Join](basepath, Rel(basepath, targpath))はtargpathと同じです。 111 // 成功した場合、返されるパスは常にbasepathに対して相対的であり、 112 // basepathとtargpathが要素を共有していなくても同じです。 113 // targpathがbasepathに相対化できない場合や、現在の作業ディレクトリの情報が必要な場合はエラーが返されます。 114 // Relは結果に対して [Clean] を呼び出します。 115 func Rel(basepath, targpath string) (string, error) 116 117 // SkipDirは、[WalkFunc] からの返り値として使用され、呼び出し元で指定されたディレクトリをスキップすることを示します。これは、どの関数からもエラーとして返されません。 118 var SkipDir error = fs.SkipDir 119 120 // SkipAllは [WalkFunc] からの戻り値として使用され、残りのすべてのファイルとディレクトリをスキップすることを示します。これはエラーではなく、いかなる関数からも戻されません。 121 var SkipAll error = fs.SkipAll 122 123 // WalkFuncは、[Walk] によって呼び出される関数の型です。この関数は、各ファイルやディレクトリを訪れるために呼び出されます。 124 // 125 // path引数には、Walkの引数がプレフィックスとして含まれています。 126 // つまり、root引数が「dir」として呼び出され、そのディレクトリに「a」という名前のファイルが見つかった場合、 127 // ウォーク関数は引数「dir/a」で呼び出されます。 128 // 129 // ディレクトリとファイルはJoinで結合され、ディレクトリ名がクリーンアップされるかもしれません。 130 // たとえば、root引数が「x/../dir」として呼び出され、そのディレクトリに「a」という名前のファイルが見つかった場合、 131 // ウォーク関数は引数「dir/a」で呼び出されます。「x/../dir/a」とはなりません。 132 // 133 // info引数は、指定されたパスのfs.FileInfoです。 134 // 135 // 関数が返すエラー結果によって、Walkの継続が制御されます。 136 // 関数が特殊値 [SkipDir] を返すと、Walkは現在のディレクトリ(info.IsDirがtrueの場合はpath、そうでない場合はpathの親ディレクトリ)をスキップします。 137 // 関数が特殊値 [SkipAll] を返すと、Walkは残りの全てのファイルとディレクトリをスキップします。 138 // さもなくば、関数が非nilのエラーを返すと、Walkは完全に停止し、そのエラーを返します。 139 // 140 // err引数は、pathに関連するエラーを報告し、Walkがそのディレクトリに進まないことを示します。 141 // 関数はそのエラーをどのように処理するかを決定できます。先述のように、エラーを返すと、 142 // Walkは木全体を走査するのを停止します。 143 // 144 // Walkは、2つの場合に、非nilのerr引数を持つ関数を呼び出します。 145 // 146 // 第1に、ルートディレクトリまたはツリー内の任意のディレクトリまたはファイルの [os.Lstat] が失敗した場合、 147 // Walkは関数を呼び出し、パスをそのディレクトリまたはファイルのパスに設定し、infoをnilに設定し、errをos.Lstatからのエラーに設定します。 148 // 149 // 第2に、ディレクトリのReaddirnamesメソッドが失敗した場合、 150 // Walkは関数を呼び出し、パスをディレクトリのパスに設定し、infoをディレクトリを説明する [fs.FileInfo] に設定し、errをReaddirnamesからのエラーに設定します。 151 type WalkFunc func(path string, info fs.FileInfo, err error) error 152 153 // WalkDirは、ルートにあるファイルツリーを走査し、各ファイルやディレクトリに対してfnを呼び出します。 154 // ツリー内のルートも含まれます。 155 // 156 // ファイルやディレクトリの訪問中に発生するすべてのエラーは、fnによってフィルタリングされます: 157 // 詳細については、[fs.WalkDirFunc] のドキュメントを参照してください。 158 // 159 // ファイルは辞書順で走査されるため、出力が確定論的になりますが、WalkDirは 160 // そのディレクトリの走査に進む前にディレクトリ全体をメモリに読み込む必要があります。 161 // 162 // WalkDirはシンボリックリンクを辿りません。 163 // 164 // WalkDirは、オペレーティングシステムに適切な区切り文字を使用するパスを 165 // fnに渡して呼び出します。これは、[io/fs.WalkDir]とは異なり、常にスラッシュで区切られたパスを使用します。 166 func WalkDir(root string, fn fs.WalkDirFunc) error 167 168 // Walkはルートとなるファイルツリーを辿り、各ファイルまたはディレクトリに対してfnを呼び出します。 169 // これにはルートも含まれます。 170 // 171 // ファイルとディレクトリの訪問時に発生するエラーは、すべてfnによってフィルタリングされます。 172 // 詳細については [WalkFunc] のドキュメントを参照してください。 173 // 174 // ファイルはレキシカルオーダーで走査されますが、これにより出力は決定論的になります。 175 // ただし、走査するディレクトリの前にディレクトリ全体をメモリに読み込む必要があります。 176 // 177 // Walkはシンボリックリンクを辿りません。 178 // 179 // WalkはGo 1.16で導入された [WalkDir] よりも効率が低下します。 180 // WalkDirでは、訪問するファイルまたはディレクトリごとにos.Lstatを呼び出すのを避けています。 181 func Walk(root string, fn WalkFunc) error 182 183 // Baseはパスの最後の要素を返します。 184 // パスの末尾のセパレーターは、最後の要素を抽出する前に削除されます。 185 // パスが空の場合、Baseは「.」を返します。 186 // パスが完全にセパレーターで構成されている場合、Baseは単一のセパレーターを返します。 187 func Base(path string) string 188 189 // Dirはパスの最後の要素以外のすべてを返します。通常はパスのディレクトリです。 190 // 最後の要素を除いた後、Dirはパスに [Clean] を呼び出し、末尾のスラッシュは除去されます。 191 // パスが空の場合、Dirは「.」を返します。 192 // パスがセパレーターだけで構成されている場合、Dirは単一のセパレーターを返します。 193 // 返されるパスは、ルートディレクトリでない限り、セパレーターで終了しません。 194 func Dir(path string) string 195 196 // VolumeNameは先頭のボリューム名を返します。 197 // Windowsの場合、"C:\foo\bar"に対しては"C:"を返します。 198 // "\\host\share\foo"に対しては"\\host\share"を返します。 199 // 他のプラットフォームでは、空文字列を返します。 200 func VolumeName(path string) string