Как проверить с помощью PHP FTP функциональность, если папка существует на сервере или нет? - PullRequest
20 голосов
/ 12 октября 2009

Есть ли способ проверить, существует ли папка на сервере, используя функциональность PHP Ftp?

Ответы [ 10 ]

33 голосов
/ 12 октября 2009

Для 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 ()"

7 голосов
/ 12 октября 2009

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

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

5 голосов
/ 22 октября 2014

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

if (ftp_nlist($ftp_stream, $new_folder) == false) {
    ftp_mkdir($ftp_stream, $new_folder);
}
5 голосов
/ 30 января 2013

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

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

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

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

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

2 голосов
/ 14 июля 2014

для проверки нескольких файлов лучше использовать ftp_chdir вместо использования функции is_dir / file_exists с упаковщиками URL, потому что они довольно медленные (каждый файл должен открывать новое соединение 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 прогонов)

1 голос
/ 16 января 2017

Меня тоже не устраивает любой ответ, в т.ч. принят один. У меня стандартное соединение (не в стиле 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);
1 голос
/ 20 мая 2015

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

if (!in_array($dirName.'/'.$something, $ftp->nlist($dirName))) {  
   // do something
}             
1 голос
/ 08 апреля 2014

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

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

0 голосов
/ 15 ноября 2017

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

function isDir($connection, $dir)
{
    $dir = trim($dir, '/');
    $dir = '/' . $dir;
    if ($dir === '/') {
        return true;
    }
    return in_array($dir, ftp_nlist($connection, dirname($dir)));
}
0 голосов
/ 05 ноября 2016

На современных 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. Например, ftp.freebsd.org не делает: (

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...