Is link: примеры (PHP)
is_link(string $filename): boolФункция is_link() проверяет, является ли заданное имя файла символической ссылкой. Она используется для определения типа файла в файловой системе.
Когда используется функция:
Основное применение — проверка существования и типа файла перед операциями чтения, записи или переходом по ссылкам. Это важно для безопасной обработки файлов в скриптах.
Аргументы функции:
Функция принимает один обязательный параметр:
string $filename— путь к проверяемому файлу.
Функция возвращает true, если файл существует и является символической ссылкой. В противном случае возвращает false.
$link = 'symlink_to_file.txt';
if (is_link($link)) {
echo "Это символическая ссылка.";
} else {
echo "Это не символическая ссылка или файл не существует.";
}Это не символическая ссылка или файл не существует.
// Создание символической ссылки
symlink('/var/www/original.txt', 'link.txt');
$result = is_link('link.txt');
var_dump($result);bool(true)
Проверяет существование файла или директории, но не различает тип. Используется для общей проверки наличия файла.
Определяет, является ли путь обычным файлом. Возвращает false для символических ссылок, которые указывают на файлы.
Проверяет, является ли путь директорией. Для символических ссылок, указывающих на директории, также возвращает true.
Для проверки именно символических ссылок применяется is_link(). Если нужно узнать, на что ссылается симлинк, используют readlink() в сочетании с is_file() или is_dir().
Если файл не существует, функция вернет false, что можно спутать с отсутствием ссылки.
$check = is_link('non_existent_file.lnk');
var_dump($check);bool(false)
Передача пути, содержащего нулевые байты, приводит к неожиданным результатам, так как они интерпретируются как конец строки.
// В PHP 8.0+ это вызовет ошибку TypeError
$result = is_link("file\0.txt");При недостаточных правах на чтение директории, содержащей файл, функция может вернуть false даже для существующей ссылки.
В PHP 8.0 функция is_link() стала строже обрабатывать типы аргументов. Передача значения, отличного от строки, вызывает TypeError. Ранее такие значения приводились к строке.
// В PHP 8
$result = is_link(null); // TypeError// В PHP 7
$result = is_link(null); // false без ошибкиfunction findSymlinks($dir) {
$links = [];
$items = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($dir)
);
foreach ($items as $item) {
if (is_link($item->getPathname())) {
$links[] = $item->getPathname();
}
}
return $links;
}
print_r(findSymlinks('.'));Array
(
[0] => ./link_to_config
[1] => ./data/temp_link
)symlink('/etc/hosts', 'hosts_link');
echo 'is_link: ' . (is_link('hosts_link') ? 'true' : 'false') . "\n";
echo 'is_file: ' . (is_file('hosts_link') ? 'true' : 'false') . "\n";is_link: true is_file: true
// Создание ссылки с относительным путем
symlink('./target.txt', 'relative_link.lnk');
// Создание ссылки с абсолютным путем
symlink('/home/user/target.txt', 'absolute_link.lnk');
echo 'Relative link check: ' . is_link('relative_link.lnk') . "\n";
echo 'Absolute link check: ' . is_link('absolute_link.lnk') . "\n";Relative link check: 1 Absolute link check: 1
$filename = 'user_input_link';
if (is_link($filename)) {
$realPath = readlink($filename);
if ($realPath !== false && strpos($realPath, '/safe/') === 0) {
$content = file_get_contents($realPath);
} else {
echo 'Ссылка указывает за пределы разрешенной директории.';
}
} else {
echo 'Файл не является символической ссылкой.';
}Is link в Python
В Python используют os.path.islink() из модуля os.
import os
result = os.path.islink('/path/to/link')
print(result)True
В Node.js применяют метод lstat() из модуля fs и проверяют свойство isSymbolicLink().
const fs = require('fs');
fs.lstat('link.txt', (err, stats) => {
if (err) console.log(err);
else console.log(stats.isSymbolicLink());
});true
В командной оболочке проверку выполняют с помощью теста -L.
if [ -L "link.txt" ]; then
echo "Это символическая ссылка"
fi