2009-10-12 4 views

Répondre

31

Pour PHP 5:

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

http://php.net/manual/en/function.is-dir.php: "PHP 5.0.0, cette fonction peut également être utilisé avec des enveloppes d'URL."

http://php.net/manual/en/wrappers.ftp.php: [Support] "PHP 5.0.0: filesize(), filetype(), file_exists(), is_file() et is_dir()"

+2

Génial, cela fonctionne aussi avec file_exists. – davethegr8

+0

Cette méthode peut-elle utiliser un tampon/connexion FTP préexistant? Si cela était possible, quelle syntaxe devrait être utilisée? Disons que nous avons déjà fait '$ ftp_buffer = ftp_connect ($ ftp_host);' et ftp_login ($ ftp_buffer, $ ftp_user, $ ftp_pass) ;, alors pourrions-nous faire quelque chose le long de 'is_dir ('ftp: example.com/some/dir/path '); '? –

+1

@MajidFouladpour: Non, c'est complètement différent de l'extension FTP, et ça ne coopère pas. http://php.net/manual/en/ref.ftp.php – Piskvor

7

Il n'existe pas de fonction 'exists' pour les connexions ftp en php.

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

+0

cela vous plonger dans le dossier que vous vérifiez, ce qui est inutile supplémentaire action, si vous voulez juste vérifier si dir existe, de sorte que vous aurez t o aller encore un niveau avec 'ftp_chdir' pour revenir – vladkras

5

trébuché sur cette question à partir de 2009 et trouvé cette question n'est pas satisfaisante pour moi. J'ai fait quelques petites recherches et j'ai trouvé un petit tweak pour ce problème.

Donc, si trouvé le * ftp_nlist * sorcière retourne un tableau de chaîne avec des noms de fichiers et dossiers witch existe dans le répertoire courant ftp, et je l'ai simplement vérifié sous le tableau (avec boucle de foreacah) si le dossier ou le fichier que nous avons recherché existe et qu'une nouvelle méthode ifExist a été créée.

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

une autre option pour le YII cadre utilisateurs de son extension ftp qui masque la lib php ftp et le rend encore plus facile de travailler avec un serveur ftp à partir du code.

J'espère que vous m'aiderez.

+0

J'ai écrit quelque chose de similaire, mais en utilisant la fonction 'in_array'. –

1

ftp_mdtm() obtient la dernière heure de modification pour un fichier distant. Renvoie la dernière heure modifiée en tant qu'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 peut-être que le fichier est le répertoire.

Notez également que tous les serveurs ne prennent pas en charge cette fonctionnalité!

1

pour la vérification des fichiers multiples, il est préférable d'utiliser ftp_chdir au lieu d'utiliser la is_dir/fonction file_exists avec des enveloppes d'URL, parce que il y a assez lent (fichier foreach il doit être ouvert une nouvelle connexion 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; 
    } 
} 

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

Le même script utilisant is_dir et file_exists nécessitait plus de 45 secondes.(Chaque fichier avait 10 pistes)

5

Essayez ceci:

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

La solution qui fonctionne pour moi:

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

Sur les serveurs FTP modernes, vous pouvez utiliser la commande MLST/MLSD pour récupérer détaillée informations 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 pour déterminer le type de noeud 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 chaque serveur prend en charge la commande MLST. Par exemple, ftp.freebsd.org n'a pas :(

1

Moi aussi je ne suis pas satisfait de tout ce qui a été accepté, j'ai une connexion standard (pas de style OO 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); 
0

est ici une fonction pour le faire. Il retourne simple true ou false. Il gère également certains cas de pointe.

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