Is writable: примеры (PHP)
is_writable(string $filename): boolФункция is_writable() проверяет, доступен ли файл или директория для записи.
Функция используется для проверки прав перед операциями записи, такими как file_put_contents(), fwrite() или mkdir(). Это помогает избежать ошибок в работе скрипта.
Функция принимает один обязательный аргумент:
- filename (string) - Путь к проверяемому файлу или директории.
Возвращает true, если файл существует и доступен для записи, иначе false.
<?php
$file = 'test.txt';
if (is_writable($file)) {
echo "В файл можно записать данные.";
} else {
echo "Файл недоступен для записи.";
}
?>Файл недоступен для записи.
<?php
$dir = '/path/to/directory';
var_dump(is_writable($dir));
?>bool(false)
<?php
$file = __DIR__ . '/config.ini';
echo is_writable($file) ? 'Да' : 'Нет';
?>Нет
Попытка открыть файл на запись. Если файл не доступен для записи, функция вернет false. Это более ресурсоемкий способ проверки.
Проверяет только существование файла или директории, но не права доступа. Часто используется в паре с is_writable().
Проверяет доступность файла или директории для чтения. Логический аналог для операции чтения.
is_writable() применяют для предварительной проверки перед записью. fopen() с обработкой ошибок подходит, если следующей операцией будет запись через дескриптор. file_exists() нужна для проверки существования, но не заменяет проверку прав.
Функция вернет false для несуществующего файла, что можно спутать с отсутствием прав.
<?php
var_dump(is_writable('missing_file.txt'));
?>bool(false)
Важен не только флаг записи для 'others', но и владелец процесса PHP (часто www-data).
PHP может кэшировать информацию о файле. При изменении прав во время выполнения скрипта результат может быть устаревшим. Помогает clearstatcache().
<?php
$file = 'test.txt';
var_dump(is_writable($file)); // false
// Предположим, права изменились внешним процессом
clearstatcache(true, $file);
var_dump(is_writable($file)); // может стать true
?>Функция is_writable() остается стабильной. В PHP 8.0 не было изменений в поведении этой функции. Основные принципы работы сохранены с ранних версий.
<?php
$dir = 'uploads/';
$filename = $dir . 'report.pdf';
if (!is_writable($dir)) {
die('Директория не доступна для записи.');
}
file_put_contents($filename, 'data');
echo 'Файл создан.';
?><?php
function isDirWritableRecursive($dir) {
if (!is_writable($dir)) return false;
foreach (new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir)) as $file) {
if ($file->isFile() && !$file->isWritable()) {
return false;
}
}
return true;
}
var_dump(isDirWritableRecursive('project/'));
?>bool(true)
Прямая проверка невозможна. Используют обертку или проверяют возвращаемые ошибки от функций FTP/SFTP.
Функция проверяет сам файл, на который ведет ссылка, а не саму ссылку.
<?php
// Предположим, link.txt -> target.txt
symlink('target.txt', 'link.txt');
// Проверяет target.txt
var_dump(is_writable('link.txt'));
?>На Windows результат зависит от ACL. На Unix-системах учитываются права пользователя, под которым работает PHP.
Is writable в Python
Используют модуль os и функцию os.access() с флагом os.W_OK.
import os
print(os.access('test.txt', os.W_OK))False
В Node.js применяют методы модуля fs, например fs.accessSync() с константой fs.constants.W_OK.
const fs = require('fs');
try {
fs.accessSync('test.txt', fs.constants.W_OK);
console.log('Доступен');
} catch {
console.log('Не доступен');
}Не доступен
Is writable в MySQL
Прямого аналога нет. Привилегии проверяются через запросы к системным таблицам, например FILE привилегия для LOAD DATA.