Подтвердить что ты не робот

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

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

4b9b3361

Ответ 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)));
}