Existe-t-il un moyen de vérifier s’il existe un dossier sur le serveur en utilisant la fonctionnalité PHP Ftp?
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 () "
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
Essaye ça:
if (ftp_nlist($ftp_stream, $new_folder) == false) {
ftp_mkdir($ftp_stream, $new_folder);
}
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.
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)
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é!
La solution qui fonctionne pour moi:
if (!in_array($dirName.'/'.$something, $ftp->nlist($dirName))) {
// do something
}
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);
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 :(
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)));
}