属性の取得
▹(stat object)(stat object on-error) object によって指定されたファイルやディレクトリの属性値からなるベクタを返します.属性値の種類については次節(属性値を抽出する手続き)の説明を参照して下さい. object は,ファイル名やディレクトリ名(文字列), ファイルポート,ファイルディスクリプタのいずれかです. ただし,ポートやディスクリプタを指定する場合, ファイルはオープンしていなければいけません. on-error は,内部的に実行しているシステムコールがエラーを返してきたとき(例えば,ファイルが存在しないなどのとき)の手続きの動作を制御するためのパラメタです.on-error に真値を指定した場合,手続きはエラー(例外)を発生して終了します.一方,#f を指定した場合,エラー(例外)を発生せずに #f を返します.このパラメタの既定値は真値です. stat 手続きはシンボリックリンクを辿ります.つまり, object がシンボリックリンクだったとき, リンクを辿った先のファイルやディレクトリの属性値からなるベクタを返します. ▹(lstat object) この手続きは, シンボリックリンクを辿らないことを除いて,stat 手続きと同じです. つまり,object がシンボリックリンクの場合, そのシンボリックリンクの属性値からなるベクタを返します. ▹実行例:カレントディレクトリ上に somefile.txt というファイルと, そのファイルへのシンボリックリンク somefile.lnk があって, 以下の作業を行っています.
$ guile GNU Guile 3.0.5 ...... 起動メッセージ ...... guile> (stat "somefile.txt") $1 = #(2053 16913871 33188 1 1000 1000 0 0 1643919306 1643919306 1643919306 4096 0 regular 420 612465598 612465598 1643919306) guile> (stat "somefile.lnk") $2 = #(2053 16913871 33188 1 1000 1000 0 0 1643919306 1643919306 1643919306 4096 0 regular 420 612465598 612465598 1643919306) guile> (lstat "somefile.lnk") $3 = #(2053 16914357 41471 1 1000 1000 0 12 1643926087 1643926079 1643926079 4096 0 symlink 511 824688809 600688550 1643926079) guile>ベクタの各成分は次節で説明する属性値を示しています.それから, やや分かりにくいのですが,somefile.lnk に対する stat の結果($2)は somefile.txt の結果($1)と一致していて,lstat の結果($3)は異なっています.例えば,第2成分の値(たぶん,inode番号)が異なります. ▹(記録) stat 手続きの処理は, システムコールの stat 関数または fstat 関数によって行っています.lstat 手続きの処理は,システムコールの lstat 関数によって行っています.
属性の抽出
▹stat 手続きや lstat 手続きによって得たベクタから属性値を抽出するために, 以下に示すような手続きが用意されています. 以下の st は stat 手続きや lstat 手続きによって取得した属性値のベクタを表します. (stat:dev st)
ファイルを格納しているデバイスのIDを返します.
(stat:ino st)
ファイルのinode番号を返します.
(stat:mode st)
ファイルのタイプとアクセス権限(を表す整数)を返します.
なお,ファイルのタイプとアクセス権限は,
それぞれ別個に,stat:type と stat:perms によって抽出できます(下記参照).
(stat:nlink st)
ファイルのハードリンクの個数を返します.
(stat:uid st)
ファイルのユーザーIDを返します.
(stat:gid st)
ファイルのグループIDを返します.
(stat:rdev st)
ファイルのデバイスIDを返します.
ただし,ファイルがキャラクターデバイスかブロックデバイスのときにのみ有効です.
それら以外のファイルに対しては0を返します.
この属性値が利用できないシステムもあります.
そのときには #f を返します.
(stat:size st)
ファイルのサイズ(バイト単位)を返します.
(stat:atime st)
ファイルの最終アクセス時刻を,基準時刻からの経過時間(秒数)で返します.
(stat:mtime st)
ファイルの最終更新時刻を,基準時刻からの経過時間(秒数)で返します.
(stat:ctime st)
ファイル属性に対する最終変更時刻を,
基準時刻からの経過時間(秒数)で返します.
(stat:atimensec st)(stat:mtimensec st)
(stat:ctimensec st)
stat:atimensec は,
ファイルの最終アクセス時刻をナノ秒単位で計測したときの stat:atime からの残余を返します.言い方を変えると,
最終アクセス時刻を秒単位で精密に計測したときの小数部をナノ秒単位の整数値として返します.他の手続きについても同様です.
なお,これらの属性値が取得できないシステムもあります.
そのときには 0 を返します.
(stat:blksize st)
ファイルの入出力を行うときのブロックサイズ(バイト単位)を返します.
この属性値を
glibc は次のように説明しています.
(stat:blocks st)
The optimal block size for reading or writing this file, in bytes. You might use this size for allocating the buffer space for reading or writing the file. (This is unrelated to st_blocks.)この説明文が述べているように,下記の stat:blocks とは無関係です.
ディスクスペース上で占有しているファイルの大きさを返します.
その単位は,512バイトのブロック単位です.
この属性値が取得できないシステムもあります.
そのときには #f を返します.
(stat:type st)
ファイルのタイプを表すシンボルを返します.
返り値として次のようなものがあります.
(stat:perms st)
- regular,directory,symlink,block-special,char-special,fifo,socket,unknown
ファイルのアクセス権限を表す整数値を返します.
▹実行例:以下では,カレントディレクトリ上の somefile.txt というファイルの属性を幾つか表示しています.
$ guile GNU Guile 3.0.5 ...... 起動メッセージ ...... guile> (define st (stat "somefile.txt")) guile> (stat:uid st) $1 = 1000 guile> (stat:size st) $2 = 21 guile> (strftime "%c" (localtime (stat:atime st))) $3 = "2022年02月04日 11時26分22秒" guile> (stat:type st) $4 = regular guile> (number->string (stat:perms st) 8) $5 = "644" guile>$1はファイルのユーザーID,$2はファイルのサイズです. $3は最終アクセス時刻を現地時間(localtime)に変換して, それを適当な書式で表示(strftime)しています. $4はファイルのタイプです.通常のファイルであることを示しています. $5はファイルのアクセス権限を8進数に変換して表示しています.
時間属性の変更
▹(utime path)(utime path actime)
(utime path actime modtime)
(utime path actime modtime actimens)
(utime path actime modtime actimens modtimens)
(utime path actime modtime actimens modtimens flags)
この手続きは, path で指定されたファイルの最終アクセス時刻や最終更新時刻を,引数に指定した時刻に設定します.その引数には, 基準時刻からの経過時間(秒数またはナノ秒数)を指定します. 一般に,current-time 手続きによって得られる現時刻や, ファイルの元々の時刻などを基準に設定時刻を計算します. それから,属性値の最終更新時刻は現時刻が自動的に設定されます. actimeは最終アクセス時刻として使用する整数です. その整数は,基準時刻からの経過時間(秒数)を表します. actimensは最終アクセス時刻をナノ秒単位で設定するときに使用します.この引数を指定したときには,actimeにこの値を加えた時刻が最終アクセス時刻(ナノ秒単位)として設定されます. modtimeは最終更新時刻として使用する整数です. その整数は,基準時刻からの経過時間(秒数)を表します. actimensは最終更新時刻をナノ秒単位で設定するときに使用します.この引数を指定したときには,actimeにこの値を加えた時刻が最終更新時刻(ナノ秒単位)として設定されます. flags は 0 かまたはグローバル定数の AT_SYMLINK_NOFOLLOW を指定します.pathがシンボリックリンクだった場合, AT_SYMLINK_NOFOLLOW を指定したときにはリンクを辿らずにシンボリックリンク自体の時刻を設定します.一方,0を指定したり省略した場合, リンクを辿った先のファイルの時刻を設定します. それぞれの引数を省略した場合, 各時刻には current-time 手続きの返り値(現時刻)が設定されます. ▹実行例:以下では,カレントディレクトリ上の somefile.txt というファイルの最終アクセス時間を現時刻から12時間後(12$\times$3600秒後)に設定しています. まず,lsコマンドを使って設定前の最終アクセス時刻を確認しています. 次に,その最終アクセス時刻をatime変数に束縛しています. 最後に,12時間後の時刻を設定して確認しています.
$ guile GNU Guile 3.0.5 ...... 起動メッセージ ...... guile> (system "ls -lu somefile.txt") -rw-r--r-- 1 algo algo 84 2月 6 09:59 somefile.txt $1 = 0 guile> (define atime (stat:atime (stat "somefile.txt"))) guile> (utime "somefile.txt" (+ atime (* 12 3600))) guile> (system "ls -lu somefile.txt") -rw-r--r-- 1 algo algo 84 2月 6 21:59 somefile.txt $2 = 0 guile>