PHP
Linux
UNIX
ファイル

ファイルシステム関数とシンボリックリンクの関係

More than 3 years have passed since last update.


操作の安全性を保証したいときに取るべき手段


1. 適切な関数を用いて種類をチェックする

ファイル
ディレクトリ
シンボリックリンク
ネームドパイプ
デバイススペシャルファイル
UNIXドメインソケット

file_exists


リンクを解決

is_file

×
リンクを解決
×

is_dir
×

リンクを解決
×

is_link
×
×

×


2. これから行う操作が可能かどうかチェックする

読み取り可能
書き込み可能
実行可能

is_readable
is_writable
is_executable

なお、これらの関数は 「存在確認」+「リンクを解決」+「○○可能」 というプロセスを踏むため、 file_exists 関数を併用する必要はありません。


実装例


読み取れるファイルかどうか判定

function is_readable_file($f) {

return !is_dir($f) && is_readable($f);
}


ファイルの作成・削除・アクセスが出来るディレクトリかどうか判定

function is_active_dir($d) {

return is_dir($d) and is_writable($d) and
PHP_OS === 'WIN32' || PHP_OS === 'WINNT' || is_executable($d);
}


無効なシンボリックリンクであるかどうか判定

function is_invalid_link($l) {

return is_link($l) && !file_exists($l);
}


リンクを解決しない関数一覧

誤っているものや足りないものがあれば教えてください!


  • is_link

  • lchgrp

  • lchwon

  • lstat


  • linkinfo (リンク解決が副作用ではなく主目的の関数なので含めます)


  • readlink (リンク解決が副作用ではなく主目的の関数なので含めます)


  • unlink ←要注意!