web-dev-qa-db-fra.com

Comment vérifier en utilisant PHP Fonctionnalité FTP si le dossier existe sur le serveur ou non?

Existe-t-il un moyen de vérifier s’il existe un dossier sur le serveur en utilisant la fonctionnalité PHP Ftp?

20
Roland

Pour PHP 5:

$folder_exists = is_dir('ftp://user:[email protected]/some/dir/path');

http://php.net/manual/en/function.is-dir.php : "À partir de PHP 5.0.0, cette fonction peut également être utilisée avec certains wrappers d'URL."

http://php.net/manual/en/wrappers.ftp.php : [Support] "à partir de PHP 5.0.0: taille du fichier (), filetype (), file_exists () , is_file () et is_dir () "

33
Piskvor

Il n'y a pas de fonction "existe" pour les connexions ftp en php.

Vous pouvez essayer ftp_chdir et vérifier le résultat

7
Ewout

Essaye ça:

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

trébuché sur cette question de 2009 et a trouvé cette question insatisfaisante pour moi. J'ai moi-même fait peu de recherches et trouvé un petit Tweak pour résoudre ce problème.

Donc, si trouvé le * ftp_nlist * function, retourne un tableau de string avec les noms de fichiers et de dossiers présents dans le répertoire ftp actuel, foreacah loop) si le dossier ou le fichier que nous avons recherché existe et une nouvelle méthode ifExist a été créée.

vous pouvez en lire plus sur php.net:http://php.net/manual/en/function.ftp-nlist.php

une autre option pour le cadre YII users est l'extension ftp qui masque la lib php ftp et facilite encore davantage l'utilisation d'un serveur ftp à partir de code.

J'espère que vous trouverez utile.

5
Evyatar Nezer

pour vérifier plusieurs fichiers, il est préférable d'utiliser ftp_chdir plutôt que d'utiliser la fonction is_dir/file_exists avec les enveloppeurs d'URL, car ils sont assez lents (pour chaque fichier, une nouvelle connexion ftp doit être ouverte ...).

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;
    }
}

Ce script était prêt après ~ 10 secondes.

Le même script utilisant is_dir et file_exists avait besoin de plus de 45 secondes. (chaque fichier a 10 pistes)

2
CodeBrauer

ftp_mdtm () obtient la dernière heure modifiée pour un fichier distant. Il retourne la dernière fois modifiée sous forme d'horodatage Unix en cas de succès, ou -1 en cas d'erreur. Notez que ftp_mdtm () ne fonctionne pas avec les répertoires. Donc, si nous obtenons -1, alors le fichier est peut-être un répertoire.

Notez également que tous les serveurs ne supportent pas cette fonctionnalité!

1
Eugen Mihailescu

La solution qui fonctionne pour moi:

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

Moi aussi pas satisfait de toute réponse incl. accepté un. J'ai une connexion standard (pas de style O-O comme dans la réponse de @ Lackeeee qui est la plus proche de la mienne):

$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
vladkras

Sur les serveurs FTP modernes, vous pouvez utiliser la commande MLST/MLSD pour récupérer des informations détaillées lisibles par machine sur les fichiers. Lisez la page RFC https://tools.ietf.org/html/rfc3659#page-23 pour en savoir plus sur cette commande.

Voici un exemple de code permettant de déterminer le type de nœud du système de fichiers:

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);

Notez que tous les serveurs ne prennent pas en charge la commande MLST. Par exemple, ftp.freebsd.org ne le fait pas :(

0
Pascal9x

Voici une fonction pour le faire. Il retourne une simple true ou false. Il gère également certains cas Edge.

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