Есть ли способ проверить, существует ли папка на сервере с использованием функциональных возможностей PHP Ftp?
Как проверить использование PHP FTP-функций, если папка существует на сервере или нет?
Ответ 1
Для PHP 5:
$folder_exists = is_dir('ftp://user:[email protected]/some/dir/path');
http://php.net/manual/en/function.is-dir.php: "Начиная с PHP 5.0.0, эта функция также может использоваться с некоторыми обертками URL".
http://php.net/manual/en/wrappers.ftp.php: [Поддержка] "Начиная с PHP 5.0.0: filesize(), filetype(), file_exists(), is_file() и is_dir()"
Ответ 2
Нет функции 'exists' для ftp-соединений в php.
Вы можете попробовать ftp_chdir и проверить результат
Ответ 3
наткнулся на этот вопрос с 2009 года и нашел этот вопрос неудовлетворительным для меня. Я сделал небольшое исследование своего собственного, нашел небольшую настройку для этой проблемы.
Итак, если найденная функция * ftp_nlist * возвращает массив строки с именами файлов и папок, которые существуют в текущем каталоге ftp, а затем я просто проверяется под массивом (с контуром foreacah), если найденная там папка или файл существует и новый метод ifExist, который был создан.
вы можете узнать больше на php.net: http://php.net/manual/en/function.ftp-nlist.php
другой вариант для YII framework - это расширение ftp, которое маскирует php ftp lib и упрощает работу с ftp-сервером из кода.
Надеюсь, ты найдешь полезным.
Ответ 4
Попробуйте следующее:
if (ftp_nlist($ftp_stream, $new_folder) == false) {
ftp_mkdir($ftp_stream, $new_folder);
}
Ответ 5
ftp_mdtm() получает последнее измененное время для удаленного файла. Он возвращает последнее измененное время как временную метку Unix при успешном выполнении или -1 при ошибке. Обратите внимание, что ftp_mdtm() не работает с каталогами. Поэтому, если мы получим -1, то, возможно, файл является каталогом.
Обратите внимание, что не все серверы поддерживают эту функцию!
Ответ 6
для проверки нескольких файлов лучше использовать ftp_chdir
вместо использования функции is_dir
/file_exists
с обертками URL-адресов, потому что они довольно медленные (для файла foreach необходимо открыть новое ftp-соединение...).
foreach ($list as $item) {
$is_dir = @ftp_chdir($ftp_handle, $item); //produces warning if file...
if ($is_dir) {
ftp_chdir($ftp_handle, '..');
$dirs[] = $item;
} else {
$files[] = $item;
}
}
Этот script был готов через ~ 10 секунд.
Тот же самый script с использованием is_dir
и file_exists
понадобился более 45 секунд. (каждый файл имел 10 запусков)
Ответ 7
Решение, которое работает для меня:
if (!in_array($dirName.'/'.$something, $ftp->nlist($dirName))) {
// do something
}
Ответ 8
Меня также не устраивает какой-либо anwser incl. приняв один. У меня стандартное соединение (не O-O-стиль, как в ответе @Lackeeee, который ближе всего к моему):
$ftp = ftp_connect($host, 21, 30);
ftp_login($ftp, $user, $password);
// if $my_dir name exists in array returned by nlist in current '.' dir
if (in_array($my_dir, ftp_nlist($ftp, '.'))) {
// do smth with $my_dir
}
ftp_close($ftp);
Ответ 9
На современных FTP-серверах вы можете использовать команду MLST/MLSD для получения подробной машиночитаемой информации о файлах. Прочтите RFC-страницу https://tools.ietf.org/html/rfc3659#page-23, чтобы узнать больше об этой команде.
Вот пример кода для определения файловой системы node type:
function isDir($ftp, $fsNodePath) {
$type = strtolower(fsNodeType($ftp, $fsNodePath));
return ($type === 'cdir' || $type === 'pdir' || $type === 'dir');
}
function isFile($ftp, $fsNodePath) {
$type = strtolower(fsNodeType($ftp, $fsNodePath));
return ($type === 'file');
}
function isLink($ftp, $fsNodePath) {
$type = strtolower(fsNodeType($ftp, $fsNodePath));
return (preg_match('/^OS\.unix\=(slink|symlink)/i', $type) === 1);
}
function fsNodeType($ftp, $fsNodePath)
{
$lines = array_values(ftp_raw($ftp, "MLST $fsNodePath"));
$linesCount = count($lines);
if ($linesCount === 1) {
throw new Exception('Unsuitable response for MLST command: ' . $lines[0]);
}
if ($linesCount !== 3) {
$e = new Exception('Unexpected response for MLST command (1)');
$e->response = $lines;
throw $e;
}
if (!preg_match('/^250\-/', $lines[0]) || !preg_match('/^250 /', $lines[2])) {
$e = new Exception('Unexpected response for MLST command (2)');
$e->response = $lines;
throw $e;
}
$spEntry = ' ' . $lines[1];
if (preg_match('/[\s\;]type\=([^\;]+)/i', $spEntry, $matches)) {
$type = trim($matches[1]);
return $type;
} else {
throw new Exception('Failed to extract filesystem node type from SP entry:' . $spEntry);
}
}
$ftp = ftp_connect('192.168.0.100');
ftp_login($ftp, 'user', '1234');
$is = isDir($ftp, 'tmp');
var_dump($is);
Обратите внимание, что не каждый сервер поддерживает команду MLST. Например, ftp.freebsd.org не делает: (
Ответ 10
Вот функция для этого. Он возвращает простой true
или false
. Он также обрабатывает некоторые случаи ребер.
function isDir($connection, $dir)
{
$dir = trim($dir, '/');
$dir = '/' . $dir;
if ($dir === '/') {
return true;
}
return in_array($dir, ftp_nlist($connection, dirname($dir)));
}