Как проверить, доступен ли ресурс потока PHP для чтения или записи?


Как в PHP проверить, доступен ли ресурс потока (или указатель файла, дескриптор или как вы хотите их называть) для чтения или записи? Например, если вы столкнулись с ситуацией, когда вы ничего не знаете о том, как был открыт или создан ресурс, как вы проверяете, читаем ли он? И как вы проверяете, доступен ли он для записи?

На основе тестирования, которое я провел (только с обычными текстовыми файлами с использованием PHP 5.3.3), fread() не выдает никаких ошибок на любом уровне, когда ресурс не читается. Он просто возвращает пустую строку, но он также делает это для пустого файла. И в идеале было бы лучше иметь проверку, которая не изменяет сам ресурс. Проверка того, доступен ли ресурс для чтения, путем попытки чтения с него, изменит положение указателя.

И наоборот, fwrite() не выдает никаких ошибок на любом уровне, когда ресурс недоступен для записи. Он просто возвращает ноль. Это немного более полезно, потому что если бы вы пытались написать определенное количество байтов в файле и fwrite() возвращает ноль, вы знаете, что что-то пошло не так. Но все же это не идеальный метод, потому что было бы гораздо лучше узнать, доступен ли он для записи, прежде чем мне нужно будет писать в него, а не пытаться написать в него и посмотреть, не получится ли это.

Кроме того, в идеале проверка должна работать с любым потоковым ресурсом, а не только с файлами.

Возможно ли это? Существует ли что-нибудь подобное? Я не смог найти ничего полезного. Заранее благодарю вас за ваше ответы.

Author: jnrbsn, 2011-03-14

2 answers

Довольно просто. Просто позвони stream_get_meta_data($resource) из вашего скрипта затем проверьте элемент массива mode возвращаемого значения:

$f = fopen($file, 'r');
$meta = stream_get_meta_data($f);
var_dump($meta['mode']); // r

И если вы хотите знать, доступны ли базовые данные для записи:

var_dump(is_writable($meta['uri'])); // true if the file/uri is writable
 25
Author: ircmaxell, 2013-03-15 05:40:38

Хорошо, возможно, это не лучшее решение, но я думаю, что этого достаточно, учитывая, что в PHP нет ничего, что делало бы это автоматически.

Для первого шага вы получите индекс ресурса из файла, а затем прочтете имя файла:

$stat = fstat($fp);
$inode = $stat['ino'];
system("find -inum $inode", $result);

Взято непосредственно из этот вопрос о поиске имени файла из файла.

Теперь, когда у вас есть имя файла (в $result), вы можете сделать fileperms($result) для него, чтобы получить разрешения.

Обратите внимание, что fileperms() возвращает значение int, и документация творит чудеса (фактически просто рассматривая значение int как восьмеричное), сохраняя это начальное значение 0 (например, 0755).

Также обратите внимание, что документация делает волшебство преобразования этого int в красивую строку, такую как -rw-r--r--

 1
Author: rockerest, 2017-05-23 12:09:11