P粉9030525562023-08-25 17:19:00
我建立了一個OOP FTP 用戶端庫,可以幫助您解決此問題很多,僅使用此程式碼,您可以檢索僅包含附加有用資訊的目錄列表,例如(chmod、上次修改時間、大小...)。
程式碼:
// Connection $connection = new FtpConnection("localhost", "foo", "12345"); $connection->open(); // FtpConfig $config = new FtpConfig($connection); $config->setPassive(true); $client = new FtpClient($connection); $allFolders = // directory, recursive, filter $client->listDirectoryDetails('/', true, FtpClient::DIR_TYPE); // Do whatever you want with the folders
P粉7636623902023-08-25 11:29:06
如果您的伺服器支援 MLSD
命令並且您有 PHP 7.2 或更高版本,則可以使用 ftp_mlsd
函數:
function ftp_mlsd_recursive($ftp_stream, $directory) { $result = []; $files = ftp_mlsd($ftp_stream, $directory); if ($files === false) { die("Cannot list $directory"); } foreach ($files as $file) { $name = $file["name"]; $filepath = $directory . "/" . $name; if (($file["type"] == "cdir") || ($file["type"] == "pdir")) { // noop } else if ($file["type"] == "dir") { $result = array_merge($result, ftp_mlsd_recursive($ftp_stream, $filepath)); } else { $result[] = $filepath; } } return $result; }
如果您沒有 PHP 7.2,您可以嘗試自行實作 MLSD
指令。首先,請參閱 ftp_rawlist
指令的使用者註解:
https://www.php.net/manual/en/ function.ftp-rawlist.php#101071
#如果您無法使用MLSD
,那麼您在判斷條目是檔案還是資料夾時尤其會遇到問題。雖然您可以使用 ftp_size
技巧,但呼叫 每個條目的 ftp_size
可能需要很長時間。
但是,如果您只需要針對一個特定的 FTP 伺服器進行工作,則可以使用 ftp_rawlist
以特定於平台的格式檢索檔案清單並對其進行解析。
以下程式碼假定採用常見的 *nix 格式。
function ftp_nlst_recursive($ftp_stream, $directory) { $result = []; $lines = ftp_rawlist($ftp_stream, $directory); if ($lines === false) { die("Cannot list $directory"); } foreach ($lines as $line) { $tokens = preg_split("/\s+/", $line, 9); $name = $tokens[8]; $type = $tokens[0][0]; $filepath = $directory . "/" . $name; if ($type == 'd') { $result = array_merge($result, ftp_nlst_recursive($ftp_stream, $filepath)); } else { $result[] = $filepath; } } return $result; }
對於 DOS 格式,請參閱:使用 PHP 從 FTP 取得目錄結構。