os.Statの挙動

less than 1 minute read

Go言語にはOSの機能を利用するためのライブラリをまとめたosパッケージが用意されています。
ファイル・ディレクトリの操作、情報の取得といったOSでの基本的な操作ができるapiが用意されており、その中にファイル・ディレクトリの情報(以下、ファイルの情報)の取得を行うStatがあります。
今回はその関数の挙動について調べた際の覚書です。

Statのシグネチャ

func Stat(name string) (fi *FileInfo, err Error)

引数

引数のnameには情報を取得したいファイル・ディレクトリを指定します。 絶対パス、相対パスのどちらでも指定でき、相対パスの場合はStatを実行するファイルが置かれている場所からの相対パスになります。

戻り値

Statの戻り値はファイルの情報とエラー情報を返します。

シグネチャを見るだけだとFileInfo構造体が返ってくるように見えますが、FileInfoは構造体ではなくインタフェースで、内部ではFileInfoインタフェースを実装したfilestat構造にファイルの情報を格納しています。

# FileInfoインタフェース
type FileInfo interface {
  Name() string
  Size() int64
  Mode() FileMode
  IsDir() bool
  sys() interface{}
}

# filestat構造体
type filestat struct {
  name string
  size int64
  mode FileMode
  modTilme time.Time
  sys syscall.Stat_t
}

挙動について

今回は下記のパターンで実行した場合にどうなるかを試しました。

  • 引数に空文字を指定
  • 存在しないディレクトリを指定(絶対パス・相対パス)
  • 存在しないファイルを指定(絶対パス・相対パス)
  • 存在するディレクトリを指定(絶対パス・相対パス)
  • 存在するファイルを指定(絶対パス・相対パス)

結論としては下記のようになりました。

パターン 結果
引数にから文字を指定 エラーを返す
存在しないディレクトリを指定(絶対パス・相対パス) エラーを返す
存在しないファイルを指定(絶対パス・相対パス) エラーを返す
存在するディレクトリを指定(絶対パス・相対パス) ディレクトリの情報を返す
存在するファイルを指定(絶対パス・相対パス) ファイルの情報を返す
権限のないディレクトリを指定 ディレクトリの情報を返す
権限のないファイルを指定 ファイルの情報を返す

存在しないファイル、ディレクトリを指定した場合は戻り値のerrにエラー情報を格納して返してくれます。
また、Statの内部では空文字でないかどうか等のチェックを行っていますので、空文字を指定した場合も同様にエラーを返してくれます。
なお、調べ切れていませんが、これ以外にもStatの内部では引数のチェックを行っているようです。

試してみて以外だったのが権限のないファイル、ディレクトリを指定した場合も情報が取得できたことです。 Statを使用したプログラムの所有者を一般ユーザーに設定して、rootユーザーが所有者のファイル・ディレクトリに対して試してみたところ、普通に情報を取得できました。
こちらももう少し調べてみようと思っています。

まとめ

Statの挙動に関して調べてみました。
引数のチェックを内部でしっかり行っているので、引数で渡すファイル、ディレクトリのパスに関してはStatにある程度任せれるのかなと思います。

Tags:

Categories:

Updated: