LoginSignup
26
24

More than 5 years have passed since last update.

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

Last updated at Posted at 2014-06-05

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

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 ←要注意!
26
24
5

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
26
24