Czy istnieje sposób sprawdzenia, czy folder istnieje na serwerze przy użyciu funkcji PHP Ftp?Jak sprawdzić za pomocą funkcji PHP FTP, czy folder istnieje na serwerze, czy nie?
Odpowiedz
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
Nie istnieje żadna funkcja "istnieje" dla połączeń FTP w php.
Można spróbować ftp_chdir i sprawdzić wynik
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
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.
Napisałem coś podobnego, ale używając funkcji "in_array". –
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ę!
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)
Spróbuj tego:
if (ftp_nlist($ftp_stream, $new_folder) == false) {
ftp_mkdir($ftp_stream, $new_folder);
}
rozwiązanie, które działa dla mnie:
if (!in_array($dirName.'/'.$something, $ftp->nlist($dirName))) {
// do something
}
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: (
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);
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)));
}
- 1. Sprawdź, czy katalog istnieje na serwerze FTP
- 2. Jak sprawdzić, czy plik jest kompletny na serwerze za pomocą FTP?
- 3. Jak mogę sprawdzić, czy plik istnieje na serwerze zdalnym za pomocą Perla?
- 4. sprawdzić, czy dane już istnieje na serwerze w angularjs
- 5. Rozszerzanie funkcji os.walk Pythona na serwerze FTP
- 6. Jak sprawdzić, czy sesja istnieje, czy nie?
- 7. jak sprawdzić, czy istnieje stała w php
- 8. Jak sprawdzić, czy kolekcja istnieje w MongoDB za pomocą Mongoid?
- 9. Jak sprawdzić, czy istnieje połączenie ajax za pomocą jQuery?
- 10. Jak sprawdzić, czy nieruchomość istnieje?
- 11. Jak mogę sprawdzić, czy plik na serwerze FTP jest identyczny z plikiem lokalnym bez pobierania pliku?
- 12. Jak sprawdzić, czy przesyłanie ftp za pośrednictwem ruby jest sukcesem?
- 13. Jak sprawdzić, czy element istnieje za pomocą wyrażenia lambda?
- 14. Jak sprawdzić, czy identyfikator e-mail istnieje, czy nie?
- 15. Sprawdzanie istnienia pliku na serwerze FTP
- 16. Jak sprawdzić, czy połączenie zostało przerwane na serwerze node.js
- 17. Czy powinienem sprawdzić wyjątkowe ograniczenie za pomocą php?
- 18. php: sprawdź, czy ścieżka istnieje?
- 19. Jak sprawdzić, czy istnieje tabela DynamoDB?
- 20. Jak sprawdzić element div, czy istnieje?
- 21. Wykryj, czy rozszerzenie PHP FreeType jest zainstalowane na serwerze
- 22. Przesyłanie FTP za pomocą formularza PHP
- 23. Jak sprawdzić wiek domeny za pomocą php
- 24. Jak sprawdzić, czy fragment istnieje?
- 25. Czy istnieje odpowiednik Java funkcji http_build_query PHP?
- 26. Jak sprawdzić, czy rekord istnieje?
- 27. Jak sprawdzić, czy istnieje klasa?
- 28. Jak sprawdzić, czy dziecko istnieje?
- 29. Jak używać SharpSVN do (szybkiego) sprawdzenia, czy zdalny folder/plik istnieje na serwerze
- 30. Czy istnieje sposób, aby sprawdzić, czy wartości nie numerycznej makro
Awesome, to również działa z file_exists. – davethegr8
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 '); '? –
@MajidFouladpour: Nie, jest to całkowicie odmienne od rozszerzenia FTP i nie współpracuje. http://php.net/manual/en/ref.ftp.php – Piskvor