Обнаружение неработающей символической ссылки в PHP в среде Windows 7 + Apache

У меня есть среда разработки Windows 7, и я использую символические ссылки (не соединения) с функцией phm symlink (). Все работает нормально, пока цель символической ссылки не будет удалена. Когда это происходит, все файловые функции PHP (file_exists (), is_file (), is_dir (), is_link (), …) возвращают false, хотя символическая ссылка все еще там.

Это становится еще более тревожным, если сломанная символическая ссылка изначально предназначалась для каталога. Я могу сделать file_put_contents () по пути символической ссылки, который создает файл с исходным целевым путем к каталогу. Это довольно неудачно и непредсказуемо.

Итак, на мой вопрос: есть ли способ обнаружить неработающую символическую ссылку в PHP в среде Windows 7? Мне нужно любое возможное решение (exec () или что-то подобное). На рабочем сервере работает стандартная конфигурация LAMP, которая работает нормально, как и ожидалось.

Я использую XAMPP с PHP 5.5.3.

Пример сценария:

$dir_path = __DIR__ . '/temporary_directory';
$link_path = __DIR__ . '/broken_symlink';
mkdir($dir_path);
symlink($dir_path, $link_path);
rmdir($dir_path);

echo 'file_exists(): ';
var_dump(file_exists($link_path));// false
echo "<br>\n";

echo 'is_file(): ';
var_dump(is_file($link_path));// false
echo "<br>\n";

echo 'is_dir(): ';
var_dump(is_dir($link_path));// false
echo "<br>\n";

echo 'is_link(): ';
var_dump(is_link($link_path));// false
echo "<br>\n";

echo 'readlink(): ';
var_dump(readlink($link_path));// false
echo "<br>\n";

// Now it is possible to create file:

file_put_contents($link_path, '');

// which creates a new file on the $dir_path. That makes the symlink somewhat hybrid as Windows Explorer thinks it is a directory symlink but it points to a file (so it's unable to resolve it).

1

Решение

Я придумал решение. Я не совсем доволен этим, но это должно сработать.

function is_link_on_windows($path) {
$parent_dir_path = dirname($path);

if (false === file_exists($parent_dir_path)) return false;

$filename_regex = preg_quote(substr($path, strlen($parent_dir_path) + 1), '#');

// DOS' dir command is unlike PHP sensitive about the path format.
$parent_dir_path = realpath($parent_dir_path);
exec('dir ' . $parent_dir_path, $dir_output);

foreach ($dir_output as $line) {
// Symlink's entry should look like this:
// broken_symlink [C:\xampp\htdocs\symlink_test\temporary_directory]
// where the part within square brackets is the symlink's target.
if (preg_match('#\\s' . $filename_regex . '\\s\\[[^\\]]+\\]#', $line)) {
return true;
}
}

return false;
}
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]