Как проверить использование PHP FTP-функций, если папка существует на сервере или нет?

Есть ли способ проверить, существует ли папка aa на сервере с использованием функциональных возможностей PHP Ftp?

Для PHP 5:

$folder_exists = is_dir('ftp://user:password@example.com/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 ()"

Для php-соединений в php нет функции «существует».

Вы можете попробовать ftp_chdir и проверить результат

наткнулся на этот вопрос с 2009 года и нашел этот вопрос неудовлетворительным для меня. Я сделал небольшое исследование своего собственного, нашел небольшую подгонку для этой проблемы.

Поэтому, если найденная функция * ftp_nlist * возвращает массив строк с именами файлов и папок, которые существуют под текущим ftp-каталогом, а затем я просто проверил под массивом (с контуром foreacah), если папка или файл, который мы искали существуют и новый метод ifExist.

вы можете узнать больше на php.net: http://php.net/manual/en/function.ftp-nlist.php

другой вариант для пользователей инфраструктуры YII – это расширение ftp, которое маскирует php ftp lib и упрощает работу с ftp-сервером из кода.

Надеюсь, ты найдешь полезным.

Попробуй это:

 if (ftp_nlist($ftp_stream, $new_folder) == false) { ftp_mkdir($ftp_stream, $new_folder); } 

ftp_mdtm () получает последнее измененное время для удаленного файла. Он возвращает последнее измененное время как временную метку Unix при успешном выполнении или -1 при ошибке. Обратите внимание, что ftp_mdtm () не работает с каталогами. Поэтому, если мы получим -1, возможно, файл – это каталог.

Также обратите внимание, что не все серверы поддерживают эту функцию!

для проверки нескольких файлов лучше использовать 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; } } 

Этот скрипт был готов через ~ 10 секунд.

Тот же скрипт с использованием is_dir и file_exists понадобился более 45 секунд. (каждый файл имел 10 запусков)

Решение, которое работает для меня:

 if (!in_array($dirName.'/'.$something, $ftp->nlist($dirName))) { // do something } 

Меня также не устраивает какой-либо anwser incl. приняв один. У меня стандартное соединение (не OO-стиль, как в ответе @ 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); 

На современных FTP-серверах вы можете использовать команду MLST / MLSD для получения подробной машиночитаемой информации о файлах. Прочтите страницу RFC https://tools.ietf.org/html/rfc3659#page-23, чтобы узнать больше об этой команде.

Вот пример кода для определения типа узла файловой системы:

 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. Например, http://ftp.freebsd.org не делает 🙁

Вот как это сделать. Он возвращает простое значение true или false . Он также обрабатывает некоторые случаи краев.

 function isDir($connection, $dir) { $dir = trim($dir, '/'); $dir = '/' . $dir; if ($dir === '/') { return true; } return in_array($dir, ftp_nlist($connection, dirname($dir))); }