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