|
ftp_nlist
Returns a list of files in the given directory
(PHP 4, PHP 5)
Example 739. ftp_nlist() example<?php The above example will output something similar to: array(3) { Code Examples / Notes » ftp_nlistmarkw
You can do a wildcard file listing with ftp_nlist, as in: $list=ftp_nlist($conn_id, "$dir/*.txt"); webmaster
To use custom LIST - flags, for example LIST -aF ../*/ (listing protected pub dirs) You can use <?php $list = ftp_nlist($ftp, "-aF ../*/"); ?> Took me a while to clever that one out :-) neodeus
This is an Example tp read out a Complete FTP Server ( beginn at your root dir ) function files($dir) { /* if(!isset($dir) || empty($dir)) { $dir=ftp_pwd($this->conn_id); } */ unset($list); unset($files); unset($folders); unset($folder); unset($file); @ftp_chdir($this->conn_id, $dir); $dir = ftp_pwd($this->conn_id); $list=Array(); $list=ftp_nlist($this->conn_id, "$dir"); $files = Array(); $folders = Array(); for($i = 0; $i != sizeof($list); $i++) { $entry = str_replace("//", "", $list[$i]); if(@ftp_chdir($this->conn_id, $entry)) { $folders[] = $entry; ftp_chdir($this->conn_id, $dir); } else { $files[] = $entry; } } print "\t<b> Dateien in ".$dir." :</b> "; foreach($files as $file) { print $file." "; } print "\t<b>Ordner in ".$dir." :</b> "; foreach ($folders as $folder) { print "\t".$folder." "; ftp_chdir($this->conn_id, $dir); $this->files($folder); } } nekrostar
This function returns an array with the directory path and all files and subdirs which are in this function ftp_searchdir($conn_id, $dir) { if( !@ftp_is_dir( $conn_id, $dir ) ) { die( 'No such directory on the ftp-server' ); } if( strrchr( $dir, '/' ) != '/' ) { $dir = $dir.'/'; } $dirlist[0] = $dir; $list = ftp_nlist( $conn_id, $dir ); foreach( $list as $path ) { $path = './'.$path; if( $path != $dir.'.' && $path != $dir.'..') { if( ftp_is_dir( $conn_id, $path ) ) { $temp = ftp_searchdir( $conn_id, ($path), 1 ); $dirlist = array_merge( $dirlist, $temp ); } else { $dirlist[] = $path; } } } ftp_chdir( $conn_id, '/../' ); return $dirlist; } ---------------------------------------------------------------------- //Looks if a directory ($dir) is isset //returns true or false function ftp_is_dir( $conn_id, $dir ) { if( @ftp_chdir( $conn_id, $dir ) ) { ftp_chdir( $conn_id, '/../' ); return true; } else { return false; } } tom
This function is way faster than those below for checking if an object is a file or folder. <?php function is_ftp_dir($file, $ftp_connection){ if(ftp_size($ftp_connection, $file) == '-1'){ return true; // Is directory }else{ return false; // Is file } } ?> rfr
There are some FTP servers that just dont accept the ftp_nlist command, they return a bool variable. but I think all of them accept the LIST command which is the ftp_rawlist command. So yu have to parse rawlist to nlist. I found a code here posted by "fredrik" but it shows a bug if the files at the ftp server have spaces oon theeir name... so here its a better function: function rawlist_2_nlist($list) { $newlist = array(); reset($list); while (list(,$row) = each($list)) { $buf=""; if ($row[0]=='d'||$row[0]=='-'){ $buf = substr($row,55); $newlist[]=$buf; } } return $newlist; } robtherat
The function from nekrostar at gmx dot net does not work for me, so I've tryed to do it my way. For checking if a found file is a directory or not I use the ftp_size function. <?php function ftplistdir($conn_id, $dir){ $fold_no = array(".", "..", "cgi-data", "comp", "zuern", "counter"); $list = ftp_nlist( $conn_id, $dir ); foreach($list as $file){ if (ftp_size($conn_id, $dir ."/".$file)== -1){ if (in_array($file, $fold_no)) { print $file ." Ueberspringe ausgeschlossenes Verzeichnis. "; } else { $geslist[]= $dir ."/". $file; $temp=ftplistdir($conn_id, $dir ."/". $file); $geslist=array_merge($geslist, $temp); } }else{ $geslist[]= $dir ."/". $file; } } return $geslist; } ?> I hope it's usefull for anyone Robert artiom1st
Sometimes, you won't be able to get folder content because of NAT or Firewall issues on your server. As a result you need to put ftp connection into a passive mode: <?php // set up basic connection $conn_id = ftp_connect($ftp_server); // login with username and password $login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass); // enabling passive mode ftp_pasv( $conn_id, true ); // get contents of the current directory $contents = ftp_nlist($conn_id, "."); // output $contents var_dump($contents); ?> turigeza on yahoo com
Recursive directory delete using ftp_nlist() ... <?php function ftp_rmdirr($path, $handle) { if (!(@ftp_rmdir($handle, $path) || @ftp_delete($handle, $path))) { $list = ftp_nlist($handle, $path); if (!empty($list)) foreach($list as $value) ftp_rmdirr($value, $handle); } @ftp_rmdir($handle, $path); } ?> It would be very useful if it was built into php. After all most of the time we want to remove non empty directories too. I bet everyone out there dealing with the file system had faced this problem. wim dot dupre
php 5.2.2 on MAC OS 1.4 (Tiger) seems to defaut to active ftp. to get ftp_nlist functioning, i needed to force ftp to passive. the default behaviour with PHP 5.2.3 on windows XP seems to be passive ftp. greetz, wim arc
in windows, ftp_nlist will die on a directory with a space in it's name. to get around this, use ftp_chdir: //change directory ftp_chdir($conn, "directory with spaces"); //then blindly list $contents = ftp_nlist($conn, ""); webmaster
In order to make file/folder separation work on remote servers that do not support ftp_size() it's better to use the function ftp_is_dir() mentioned below: <?php //identify directories function ftp_is_dir($dir) { global $ftp_connect; if (ftp_chdir($ftp_connect, $dir)) { ftp_chdir($ftp_connect, '..'); return true; } else { return false; } } $ftp_nlist = ftp_nlist($ftp_connect, "."); //alphabetical sorting sort($ftp_nlist); foreach ($ftp_nlist as $v) { //1. ftp_is_dir() is true => directory if (ftp_is_dir($v)) { //output as [ directory ] echo "[ " . $v . " ]<br />\n"; } } foreach ($ftp_nlist as $v) { //2. ftp_is_dir() is false => file if (!ftp_is_dir($v)) { //output as file echo "" . $v . "<br />\n"; } } ?> kip
If you're just after an ftp version of is_dir you can see if ftp_chdir returns true or false.
ralph
If you receive an error due some open_basedir restrictions, use the following: <?php putenv('TMPDIR=/tmp/'); $filelist = ftp_nlist($ftp, "./accounts"); ?> (if /tmp/ is an allowed directory within open_basedir) It took me a while to find this out. louis
If you do a wildcard or other search for a particular file and the file doesn't exist, Solaris FTP servers send back "search*.xml: No such file or directory" as a single element in the response array. This makes it hard to check for the presence of a file. One possible work-around is to parse your own raw directory listing. Or you could check for the error verbatim. But different servers could return different values. A simpler way to compensate is to use the ftp_size command to validate the returned file: if ( ($filelist = ftp_nlist( $this->conn_id, $filesearch )) === FALSE ) { Error( "Could not get file list" ); return FALSE; } // File actually exists? Catches invalid FTP server list responses if ( !count($filelist) || ftp_size( $this->conn_id, $filelist[0] ) == -1 ) { Error( "No valid files" ); return FALSE; } // File is really there, fetch it or whatever else you want to do sksafarath
If we are giving second parameter as full directory path then it wil return the list of files with full path, If we want to list only files you can do as following code // set up basic connection $conn_id = ftp_connect($ftp_server); // login with username and password $login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass); //if u want to display the files from /home/test/ //change directory point to /home/test using ftp_chdir($conn_id, "test"); //then pass second parameter as null which will give the list of files. // get contents of the current directory $contents = ftp_nlist($conn_id, ""); Note: This is working for me in PHP5 bintjes
I've made a recursive function to list all files from folders and subfolders using ftp_rawlist() . I used the function below from ari, parse_rawlist() function list_all_files($conn_id, $path){ $buff = ftp_rawlist($conn_id, $path); $res = parse_rawlist( $buff) ; static $flist = array(); if(count($res)>0){ foreach($res as $result){ // verify if is dir , if not add to the list of files if($result['size']== 0){ // recursively call the function if this file is a folder list_all_files($conn_id, $path.'/'.$result['name']); } else{ // this is a file, add to final list $flist[] = $result; } } } return $flist; } webmaster
How to get the file list in alphabetical order with all directories at the top: <?php $ftp_nlist = ftp_nlist($ftp_connect, "."); //alphabetical sorting sort($ftp_nlist); foreach ($ftp_nlist as $v) { //1. Size is '-1' => directory if (ftp_size($ftp_connect, $v) == -1) { //output as [ directory ] echo "[ " . $v . " ]<br />\n"; } } foreach ($ftp_nlist as $v) { //2. Size is not '-1' => file if (!(ftp_size($ftp_connect, $v) == -1)) { //output as file echo "" . $v . "<br />\n"; } } ?> Result looks like: [ a_mydirectory ] [ b_mydirectory ] [ c_mydirectory ] ... a_myfile.htm b_myfile.css c_myfile.php ... dreamsavior
Here is the function that would checking whether the given path is directory or not, using ftp_nlist; <?php function is_ftp_dir($itempath, $ftp_server, $ftp_user_name='anonymous', $ftp_user_pass='') { if (empty($ftp_user_name)) { $ftp_user_name = "anonymous"; } if ($itempath[0]!=="/") { $itempath = "/".$itempath; } $conn_id = ftp_connect($ftp_server); $login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass); $contents = ftp_nlist($conn_id, "$itempath"); if (!empty($contents[0])) { $check = str_replace($itempath, "", $contents[0]); if (!empty($check)) { return true; } } ftp_close($conn_id); } // example : if (is_ftp_dir("/pub/ftp/unknownitem", "ftp.nowhere", 'username', 'verysecret'')) { // do something related to directory handling action } else { // The target item is a file ... } ?> nigel
Further to kip's post, this works: if (!ftp_chdir($conn, $folder)) { ftp_mkdir($conn, $folder); ftp_chdir($conn, $folder); } josh
Function Keywords: is_file is_dir <?php $ftp_server = 'IP OR HOSTNAME HERE'; $ftp_user_name = 'USERNAME'; $ftp_user_pass = 'PASSWORD'; // set up basic connection $conn_id = ftp_connect($ftp_server); // login with username and password $login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass); function ftp_is_dir($folder) { global $conn_id; if (ftp_chdir($conn_id, $folder)) { ftp_chdir($conn_id, '..'); return true; } else { return false; } } function xdir($path) { global $conn_id; $contents = ftp_nlist($conn_id, $path); foreach($contents as $file) { if ($file!='.'&&$file!='..') { if (ftp_is_dir($file)) { echo $file . ' is a folder '; } else { echo $file . ' is a file '; } } } } xdir('.'); ?> can be looped through... using the function xdir if the file is a folder ;) Returns a warning upon not being a folder... use error_reporting(0); to resolve this issue. tobrien
ftp_nlist() or ftp_rawlist() takes ages then returns nothing... If you are having this issue, you may need to enable PASV mode FTP transfers using the ftp_pasv() function. Example... <?php $ftp_host = "yourFTPHost"; $ftp_user = "yourUsername"; $ftp_password = "yourPassword"; //Connect echo "<br />Connecting to $ftp_host via FTP..."; $conn = ftp_connect($ftp_host); $login = ftp_login($conn, $ftp_user, $ftp_password); // //Enable PASV ( Note: must be done after ftp_login() ) // $mode = ftp_pasv($conn, TRUE); //Login OK ? if ((!$conn) || (!$login) || (!$mode)) { die("FTP connection has failed !"); } echo "<br />Login Ok.<br />"; // //Now run ftp_nlist() // $file_list = ftp_nlist($conn, ""); foreach ($file_list as $file) { echo " $file"; } //close ftp_close($conn); ?> mail
Beware: The array will contain complete paths, not just filenames. At least in PHP 4.3.11 when I tried ftp_nlist("www.example.com/docs/some/thing") it dumped something like this: [0]=> string(41) "www.example.com/docs/some/thing/file1.htm" [1]=> string(41) "www.example.com/docs/some/thing/file2.htm" [2]=> string(41) "www.example.com/docs/some/thing/file3.htm" [3]=> string(41) "www.example.com/docs/some/thing/file4.htm" [4]=> string(41) "www.example.com/docs/some/thing/file5.htm" franck569
better version of turigeza on yahoo com ftp_rmdirr() function. This return true or false if the path will be removed : function ftp_rmdirr($handle, $path) { if(!@ftp_delete($handle, $path)) { $list = @ftp_nlist($handle, $path); if(!empty($list)) foreach($list as $value) ftp_rmdirr($handle, $value); } if(@ftp_rmdir($handle, $path)) return true; else return false; } andym
Be careful tom at crysis-online dot com - your suggested method seems to be server dependent. I'm currently trying to talk to a proftpd server and the size returned is -1 for all files it seems.
ds
Another file filecollect script, with static. <?php function filecollect($conn_id,$dir='.') { static $flist=array(); if ($files = ftp_nlist($cid,$dir)){ foreach ($files as $file) { if (ftp_size($cid, $file) == "-1"){ filecollect($cid,$file); } else $flist[] = $file; } } return $flist; } $conn_id = ftp_connect('ftp.nowhere.com') or die("Couldn't connect to server"); if (@ftp_login($conn_id, 'anonymous', 'pass@nowhere.com')){ $filelist = filecollect($conn_id); echo "<pre>"; print_r($filelist); echo "</pre>"; } ?> nigel
Actually, this works better (suppresses the error when ftp_chdir() fails)!: if (!@ftp_chdir($ftp_conn, $userfolder)) { ftp_mkdir($ftp_conn, $userfolder); ftp_chdir($ftp_conn, $userfolder); } ryan
A note to developers using PHP on Windows servers: as of PHP 4.1.2, ftp_nlist() is broken in the Windows build of PHP. It will return nothing at all, even if the same code works fine on UNIX. So if you're going crazy trying to figure out why the function isn't returning anything, stop wasting your time, you're not doing anything wrong. Hopefully this will get fixed in future versions, although it's apparently been an issue since at least 4.0.6. More info on this bug is at http://bugs.php.net/bug.php?id=16057 micksam7
A little correction to king_killa at juggalos4life dot com's note, it isn't ftp_res, it's ftp_size. By the way, here is a complete function that will get all the files on a server, then write them to a array. <?php $ftp1 = ftp_connect('ftp.nowhere1230404.foo') or die("Couldn't connect to server"); ftp_login($ftp1,'foo','bar'); ftp_pasv($ftp1, TRUE); //Passive Mode is better for this //Get them file! echo "Collecting Files on Neodecoder "; //Set defaults just in case. PHP complains anyway if we don't. $dir = ""; function filecollect($dir,$filelist) { global $ftp1; //Get our ftp $files = ftp_nlist($ftp1,$dir); //get files in directory foreach ($files as $file) { $isfile = ftp_size($ftp1, $file); if($isfile == "-1") { //Is a file or directory? $filelist = filecollect($dir.'/'.$file,$filelist,$num); //If a folder, do a filecollect on it } else { $filelist[(count($filelist)+1)] = $file; //If not, add it as a file to the file list } } return $filelist; } $filelist = filecollect($dir,$filelist); echo "<pre>"; print_r($filelist); echo "</pre>"; ?> This is really handy if your trying to transfer all the files from a ftp server to another server. Which, is why I made the script in the first place. heh.. fx dot menard
A derived use of ftp_nlist function: determine if a given path exists and is a directory or a plain file (this is not easy with basic ftp functions). This code doesn't issue any warning or error. It makes use of ls option -d for efficiency, and -F to append a slash if the retrieved path is a directory. <?php // returns information on a given ftp path // 0 if path does not exist // 1 if path is a file // 2 if path is a directory function ftp_pathtype( $conn, $path ) { $res = ftp_nlist( $conn, "-dF " . $path ); if ( isset( $res[0] ) and strlen( $res[0] ) ) { if ( $res[0][ strlen( $res[0] )-1 ] === "/" ) // a directory return 2; else return 1; } else return 0; } ?> |
Change Languageftp_alloc ftp_cdup ftp_chdir ftp_chmod ftp_close ftp_connect ftp_delete ftp_exec ftp_fget ftp_fput ftp_get_option ftp_get ftp_login ftp_mdtm ftp_mkdir ftp_nb_continue ftp_nb_fget ftp_nb_fput ftp_nb_get ftp_nb_put ftp_nlist ftp_pasv ftp_put ftp_pwd ftp_quit ftp_raw ftp_rawlist ftp_rename ftp_rmdir ftp_set_option ftp_site ftp_size ftp_ssl_connect ftp_systype |