2009-10-12 17 views

Odpowiedz

31

dla PHP 5:

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

http://php.net/manual/en/function.is-dir.php: "Począwszy od PHP 5.0.0, ta funkcja może być użyta także z niektórymi nakładkami URL."

http://php.net/manual/en/wrappers.ftp.php: [Pomoc] "Od PHP 5.0.0: Wielkość pliku (typ pliku),(),() file_exists is_file() i()" is_dir

+2

Awesome, to również działa z file_exists. – davethegr8

+0

Czy ta metoda może wykorzystywać istniejący bufor/login FTP? Jeśli tak, to jaka powinna być stosowana składnia? Powiedzmy, że już zrobiliśmy '$ ftp_buffer = ftp_connect ($ ftp_host);' and 'ftp_login ($ ftp_buffer, $ ftp_user, $ ftp_pass);', następnie możemy zrobić coś wzdłuż 'is_dir ('ftp: example.com/some/dir/path '); '? –

+1

@MajidFouladpour: Nie, jest to całkowicie odmienne od rozszerzenia FTP i nie współpracuje. http://php.net/manual/en/ref.ftp.php – Piskvor

7

Nie istnieje żadna funkcja "istnieje" dla połączeń FTP w php.

Można spróbować ftp_chdir i sprawdzić wynik

+0

będzie nurkować cię w folderze masz kontroli, który jest bezużyteczny extra akcja, jeśli chcesz tylko sprawdzić, czy katalog istnieje, więc będziesz miał t o przejdź o jeden poziom wyżej z 'ftp_chdir' ponownie, aby odzyskać – vladkras

5

natknęliśmy się na to pytanie od 2009 roku i znalazł to pytanie dla mnie niesatysfakcjonujące. Zrobiłem małe badania na własną rękę i znalazłem drobną korektę dla tego problemu.

Więc jeśli uznało * ftp_nlist * czarownica funkcja zwraca tablicę ciąg z plikami i folderami nazwy wiedźmy istnieją w bieżącym katalogu ftp, a potem ja po prostu sprawdzić w tablicy (z pętli foreacah) jeśli szukany folder lub plik istnieje i utworzona została nowa metoda ifExist.

można przeczytać więcej na php.net: http://php.net/manual/en/function.ftp-nlist.php

inna opcja dla ram Yii użytkownicy jej rozszerzenie ftp, który maskuje lib php ftp i czyni go jeszcze łatwiej pracować z serwerem ftp z kodu.

Mam nadzieję, że okaże się pomocny.

+0

Napisałem coś podobnego, ale używając funkcji "in_array". –

1

ftp_mdtm() pobiera czas ostatniej modyfikacji pliku zdalnego. Zwraca czas ostatniej modyfikacji jako uniksowy znacznik czasu w przypadku sukcesu lub -1 w przypadku błędu. Należy zauważyć, że ftp_mdtm() nie działa z katalogami. Więc jeśli otrzymamy -1, to może plik jest katalogiem.

Należy również pamiętać, że nie wszystkie serwery obsługują tę funkcję!

1

do sprawdzenia wiele plików lepiej jest użyć ftp_chdir zamiast korzystania z funkcji is_dir/file_exists z nakładkami URL, bo tam są dość powolne (plik foreach nie muszą być otwarte nowe połączenie 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; 
    } 
} 

Ten skrypt był gotowy po ~ 10 sekundach.

Ten sam skrypt przy użyciu is_dir ipotrzebował więcej niż 45 sekund.(Każdy plik miał 10 biegi)

5

Spróbuj tego:

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

rozwiązanie, które działa dla mnie:

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

na nowoczesnych FTP serwerów można użyć polecenia MLST/MLSD pobrać szczegółowy odczytywalne maszynowo informacje o plikach. Przeczytaj stronę RFC https://tools.ietf.org/html/rfc3659#page-23, aby dowiedzieć się więcej o tym poleceniu.

Oto przykładowy kod, aby określić typ węzła plików:

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

Należy pamiętać, że nie każdy serwer obsługuje komendę MLST. Na przykład ftp.freebsd.org nie: (

1

Ja również nie jestem zadowolony z żadnego anwsera włącznie z zaakceptowanym Mam standardowe połączenie (nie w stylu OO, jak w odpowiedzi @Lackeeee, która jest najbliższa mojej):

$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

Oto funkcja to zrobić. zwraca prosty true lub false. zajmuje się także kilka przypadków krawędzi.

function isDir($connection, $dir) 
{ 
    $dir = trim($dir, '/'); 
    $dir = '/' . $dir; 
    if ($dir === '/') { 
     return true; 
    } 
    return in_array($dir, ftp_nlist($connection, dirname($dir))); 
} 
Powiązane problemy