web-dev-qa-db-ja.com

PHPでディレクトリが書き込み可能かどうかを確認するにはどうすればよいですか?

PHPでディレクトリが書き込み可能かどうかを確認する方法を知っている人はいますか?

関数 is_writable はフォルダーに対して機能しません。 (編集:動作します。受け入れられた答えを参照してください。)

58
SeanDowney

はい、フォルダに対して機能します。..

ファイル名が存在し、書き込み可能な場合はTRUEを返します。 filename引数には、ディレクトリが書き込み可能かどうかを確認できるディレクトリ名を指定できます。

91
DGM

これはコードです:)

<?php 

$newFileName = '/var/www/your/file.txt';

if ( ! is_writable(dirname($newFileName))) {

    echo dirname($newFileName) . ' must writable!!!';
} else {

    // blah blah blah
}
18
Irfan EVRENS

所有者/グループ/世界をより具体的にする

$dir_writable = substr(sprintf('%o', fileperms($folder)), -4) == "0774" ? "true" : "false";

平和...

6
Griffith

is_writable()関数への完全なファイルパスを送信している可能性があります。ファイルがディレクトリに存在しない場合、is_writable()はfalseを返します。この場合、ファイル名を削除してディレクトリ自体を確認する必要があります。その場合、_is_writable_はディレクトリが書き込み可能かどうかを正しく通知します。 _$file_にファイルパスが含まれている場合は、次のようにします。

_$file_directory = dirname($file);
_

次に、is_writable($file_directory)を使用して、フォルダーが書き込み可能かどうかを判別します。

これが誰かの助けになることを願っています。

5
user189249

is_writableのドキュメント によると、動作するはずです-しかし、あなたは「フォルダ」と言ったので、これは Windowsの問題 かもしれません。コメントは 回避策 を示唆しています。

(先に急いで読んだことで、末尾のスラッシュが重要であると思いましたが、それはこの回避策に固有のものであることが判明しました)。

4
Quentin

スクリプトが存在する同じディレクトリ内のすべてのディレクトリを検出し、各ディレクトリが書き込み可能かどうかに関係なくページに書き込む小さなスクリプトを作成しました(isWritable.phpと呼びます)。お役に立てれば。

<?php
// isWritable.php detects all directories in the same directory the script is in
// and writes to the page whether each directory is writable or not.

$dirs = array_filter(glob('*'), 'is_dir');

foreach ($dirs as $dir) {
    if (is_writable($dir)) {
        echo $dir.' is writable.<br>';
    } else {
        echo $dir.' is not writable. Permissions may have to be adjusted.<br>';
    } 
}
?>
3
Studocwho

stat()

システムの統計情報によく似ていますが、PHPにあります。確認したいのはモード値です。これは、他の言語(I.E. C/C++)でstatを呼び出した場合とまったく同じです。

http://us2.php.net/stat

2
Jason Mock

私の場合、 is_writableはtrueを返しましたが、ファイルを書き込もうとするとエラーが生成されました。
このコードは、$dirが存在し、書き込み可能です:

<?php
$dir = '/path/to/the/dir';

// try to create this directory if it doesn't exist
$booExists     = is_dir($dir) || (mkdir($dir, 0774, true) && is_dir($dir));
$booIsWritable = false;
if ($booExists && is_writable($dir)) {
    $tempFile = tempnam($dir, 'tmp');
    if ($tempFile !== false) {
        $res = file_put_contents($tempFile, 'test');

        $booIsWritable = $res !== false;
        @unlink($tempFile);
    }
}
1
Andron

これは私がそれを行う方法です:

file_put_contents()を使用してファイルを作成し、戻り値を確認します。正の値(バイト単位で書き込まれた数)であれば、先に進んで必要な処理を行います。FALSEの場合は書き込み不可です

$is_writable = file_put_contents('directory/dummy.txt', "hello");

if ($is_writable > 0) echo "yes directory it is writable";

else echo  "NO directory it is not writable";

その後、unlink()を使用してダミーファイルを削除できます。

unlink('directory/dummy.txt');
1
Nassim

PHP manual is_writable によると、ディレクトリでうまく動作するはずです。

1
Lasar