2009-10-12 19 views

Respuesta

31

Para PHP 5:

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

http://php.net/manual/en/function.is-dir.php: "A partir de PHP 5.0.0, esta función también se puede utilizar con algunas URL."

http://php.net/manual/en/wrappers.ftp.php: [Soporte] "A partir de PHP 5.0.0: Tamaño del archivo(), tipo de archivo(),() file_exists, is_file(), y is_dir()"

+2

Impresionante, esto también funciona con file_exists. – davethegr8

+0

¿Podría este método usar un buffer/login de FTP preexistente? Si pudiera, ¿qué sintaxis debería usarse entonces? Digamos que ya hemos hecho '$ ftp_buffer = ftp_connect ($ ftp_host);' y 'ftp_login ($ ftp_buffer, $ ftp_user, $ ftp_pass);', entonces podríamos hacer algo a lo largo de 'is_dir ('ftp: example.com/some/dir/ruta '); '? –

+1

@MajidFouladpour: No, esto es completamente diferente de la extensión de FTP, y no coopera. http://php.net/manual/en/ref.ftp.php – Piskvor

7

No existe la función 'exists' para las conexiones ftp en php.

Usted podría intentar ftp_chdir y comprobar el resultado

+0

esto le sumergirse en carpeta que está comprobando, que no sirve para nada adicional acción, si solo quiere comprobar si existe directorio, entonces tendrá t o subir un nivel con 'ftp_chdir' nuevamente para volver – vladkras

5

topamos con esta pregunta a partir de 2009 y se encontró esa pregunta insatisfactoria para mí. He investigado poco por mi cuenta y he encontrado un pequeño cambio para ese tema.

Así que si se encuentra el ftp_nlist * * bruja función devuelve una matriz de cuerda con archivos y carpetas nombres de brujas existen bajo el directorio FTP actual, y luego simplemente he comprobado en virtud de la matriz (con bucle foreacah) si la carpeta o archivo que buscamos existe allí y si se ha creado un nuevo método ifExist.

se puede leer más en php.net: http://php.net/manual/en/function.ftp-nlist.php

otra opción para el marco YII usuarios de la extensión de su ftp que enmascara el lib php ftp y hace que sea aún más fácil trabajar con un servidor ftp del código

Espero que encuentres útil.

+0

Escribí algo similar, pero usando la función 'in_array'. –

1

ftp_mdtm() obtiene la última hora de modificación para un archivo remoto. Devuelve la última hora modificada como una marca de tiempo Unix en caso de éxito, o -1 en caso de error. Tenga en cuenta que ftp_mdtm() no funciona con directorios. Entonces, si obtenemos -1, tal vez el archivo sea directorio.

Tenga en cuenta también que no todos los servidores admiten esta función.

1

para el control de varios archivos que es mejor utilizar ftp_chdir en lugar de utilizar la función is_dir/file_exists con envolturas de URL, porque hay bastante lento (archivo foreach no se debe abrir una nueva conexión 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; 
    } 
} 

Este script estuvo listo después de ~ 10 seg.

El mismo script que usa is_dir y file_exists necesita más de 45 seg.(Cada archivo tenía 10 carreras)

5

Prueba esto:

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

La solución que funciona para mí:

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

Por modernos servidores FTP puede utilizar comandos MLST/MLSD para recuperar detallada información legible por máquina sobre archivos. Lea la página RFC https://tools.ietf.org/html/rfc3659#page-23 para obtener más información sobre este comando.

Aquí es código de ejemplo para determinar el tipo de nodo de sistema de archivos:

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

Tenga en cuenta que no todos los servidores soporta comandos MLST. Por ejemplo, ftp.freebsd.org no :(

1

Yo tampoco estoy satisfecho con ningún artículo incluido uno aceptado. Tengo una conexión estándar (no de estilo OO en la respuesta de @ Lackeeee, que es la más cercana a la mía):

$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

Aquí es una función para hacer esto. devuelve un simple true o false. también se ocupa de algunos casos extremos.

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