|
ftp_rawlist
Returns a detailed list of files in the given directory
(PHP 4, PHP 5)
Example 744. ftp_rawlist() example<?php The above example will output something similar to: array(3) { Code Examples / Notes » ftp_rawlistryan
[[ Editors note: Seems it was fixed in PHP 4.3.0 ]] A note to developers using PHP on Windows servers: as of PHP 4.1.2, ftp_rawlist() 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 kerbpm
Your code is ok, just replace $i = 0 instead of 1 Thank you <?php function parse_rawlist( $array ) { for ( $i = 1; $i < count($array); $i++ ) { $current = $array[$i]; $structure[$i]['perms'] = substr($current, 0, 10); $structure[$i]['number'] = trim(substr($current, 11, 3)); $structure[$i]['owner'] = trim(substr($current, 15, 8)); $structure[$i]['group'] = trim(substr($current, 24, 8)); $structure[$i]['size'] = trim(substr($current, 33, 8)); $structure[$i]['month'] = trim(substr($current, 42, 3)); $structure[$i]['day'] = trim(substr($current, 46, 2)); $structure[$i]['time'] = substr($current, 49, 5); $structure[$i]['name'] = substr($current, 55, strlen($current) - 55); } return $structure; } ?> marc dot peterlongo
When you try: $path = "directory pathname with spaces"; $list = ftp_rawlist($conn_id,$path); It doesn't work but when you try: $path = "directory pathname with spaces"; ftp_chdir($conn_id,$path); $list = ftp_rawlist($conn_id,"."); It works davidknoll
Well, this works for me: <?php function parsed_listing($path) { $conn = ftp_connect(FTP_HOST); ftp_login($conn, FTP_USER, FTP_PASS); $list = ftp_rawlist($conn, "-a ".FTP_BASE.$path); ftp_close($conn); $i = 0; foreach ($list as $current) { $split = preg_split("[ ]", $current, 9, PREG_SPLIT_NO_EMPTY); if ($split[0] != "total") { $parsed[$i]['isdir'] = $split[0]{0} === "d"; $parsed[$i]['perms'] = $split[0]; $parsed[$i]['number'] = $split[1]; $parsed[$i]['owner'] = $split[2]; $parsed[$i]['group'] = $split[3]; $parsed[$i]['size'] = $split[4]; $parsed[$i]['month'] = $split[5]; $parsed[$i]['day'] = $split[6]; $parsed[$i]['time/year'] = $split[7]; $parsed[$i]['name'] = $split[8]; $i++; } } return $parsed; } ?> jonathan almarez
To make the latest correction to the parsing code: "ergye at yahoo dot com" dosen't take into account for files or directories that are older than a year where instead of showing the time, it shows the year. The code below not only parses: drwxrwxr-x 2 503 503 4096 Dec 3 12:12 CVAR It also parses: drwxrwxr-x 2 503 503 4096 Dec 3 2003 CVAR 0 = file 1 = directory 2 = simlink <?php function itemize_dir($contents) { foreach ($contents as $file) { if(ereg("([-dl][rwxst-]+).* ([0-9]) ([a-zA-Z0-9]+).* ([a-zA-Z0-9]+).* ([0-9]*) ([a-zA-Z]+[0-9: ]*[0-9])[ ]+(([0-9]{2}:[0-9]{2})|[0-9]{4}) (.+)", $file, $regs)) { $type = (int) strpos("-dl", $regs[1]{0}); $tmp_array['line'] = $regs[0]; $tmp_array['type'] = $type; $tmp_array['rights'] = $regs[1]; $tmp_array['number'] = $regs[2]; $tmp_array['user'] = $regs[3]; $tmp_array['group'] = $regs[4]; $tmp_array['size'] = $regs[5]; $tmp_array['date'] = date("m-d",strtotime($regs[6])); $tmp_array['time'] = $regs[7]; $tmp_array['name'] = $regs[9]; } $dir_list[] = $tmp_array; } return $dir_list; } $buff = ftp_rawlist($cid, "/"); $items = itemize_dir($buff); ?> nate
this snip fixes the date problem with the listing and sorts out the variables: $filedata['access_permissions'] $filedata['link_count'] $filedata['uid'] $filedata['gid'] $filedata['size'] $filedata['mod_date_month'] $filedata['mod_date_day'] $filedata['mod_time'] $filedata['name'] list($filedata['access_permissions'], $filedata['link_count'], $filedata['uid'], $filedata['gid'], $filedata['size'], $filedata['mod_date_month'], $filedata['mod_date_day'], $filedata['mod_time'], $filedata['name']) = preg_split("/[\s,]+/", $value); $filedata['type'] = $filedata['access_permissions']{0}; $filedata['access_permissions'] = substr($filedata['access_permissions'],1); // now check the date to see if the last modifcation was this year or last. if ( strrpos($filedata['mod_time'], ':') != 2 ) { $filedata['mod_date'] = $filedata['mod_date_month'] ." " . $filedata['mod_date_day'] . " " . $filedata['mod_time']; $filedata['mod_time'] = "00:00"; } else { $filedata['mod_date'] = $filedata['mod_date_month'] ." " . $filedata['mod_date_day'] . " " . date("Y"); } naivesong
This script will properly handle FTP servers where the returned date/time differs from the generic mm-dd-YYYY hh:mm:ss format: <?php $list = ftp_rawlist ($ftp_stream, $ftp_directory); $folders = array(); $files = array(); $links = array(); for ($i=0; $i<count($list); $i++) { //----convert tabs to blanks $list[$i] = str_replace ("\t", " ", $list[$i]); //----delete multiple blanks while (($k = strpos($list[$i], " ")) !== FALSE) $list[$i] = substr($list[$i],0,$k+1).trim(substr($list[$i],$k)); //----split link reference from filename where available if (($k = strpos($list[$i], " -> ")) !== FALSE) { $filelink = substr($list[$i], $k+4); $list[$i] = substr($list[$i], 0, $k); } else $filelink = ""; //----parse filename $k = strrpos($list[$i], " "); $filename = substr($list[$i], $k+1); $list[$i] = substr($list[$i], 0, $k); //----parse the rest of info list ($permissions, $list[$i]) = parsenext ($list[$i]); list ($number, $list[$i]) = parsenext ($list[$i]); list ($owner, $list[$i]) = parsenext ($list[$i]); list ($group, $list[$i]) = parsenext ($list[$i]); list ($size, $time) = parsenext ($list[$i]); //----ok, put all this into the related array if ($filename != "." && $filename != "..") { $m = array(); $m["name"] = $filename; $m["link"] = $filelink; $m["size"] = $size; $m["time"] = $time; $m["owner"] = $owner; $m["group"] = $group; $m["permissions"] = $permissions; if (substr($permissions, 0, 1) == "d") $folders[count($folders)] = $m; else if (substr($permissions, 0, 1) == "l") $links[count($files)] = $m; else $files[count($files)] = $m; } } sort ($folders); sort ($files); sort ($links); ?> This script works fine on any raw list that complies with the following format: permissions number owner group size time name [" -> " link_to] where time may have whatever format the FTP server wants. ;-) It also returns folders, files and links in separated sorted lists (got this idea from the note of "postmaster at alishomepage dot com" in this help page). ari
This is a little cleaner: function parse_rawlist( $array ) { foreach($array as $curraw) { $struc = array(); $current = preg_split("/[\s]+/",$curraw,9); $struc['perms'] = $current[0]; $struc['number'] = $current[1]; $struc['owner'] = $current[2]; $struc['group'] = $current[3]; $struc['size'] = $current[4]; $struc['month'] = $current[5]; $struc['day'] = $current[6]; $struc['time'] = $current[7]; $struc['year'] = $current[8]; $struc['raw'] = $curraw; $structure[$struc['name']] = $struc; } return $structure; } cialdi
the second parameter accepts also standard arguments of /bin/ls command like "-l" or "-t"
greg
The previous regular expression(by Jonathan Almarez,ergye at yahoo dot com and guru at virusas dot lt) is very good.But i found it does not take into account for directories(number>9) Change [0-9] to [0-9]* The code below not only parses: drwxrwxr-x 9 msik ia 4096 Nov 5 14:19 Group3 It also parses: drwxrwxr-x 19 msik ia 4096 Nov 5 14:19 Group3 3 drwxrwxr-x 119 msik ia 4096 Nov 5 14:19 Group3 3 0 = file 1 = directory 2 = simlink <?php function itemize_dir($contents) { foreach ($contents as $file) { if(ereg("([-dl][rwxst-]+).* ([0-9]*) ([a-zA-Z0-9]+).* ([a-zA-Z0-9]+).* ([0-9]*) ([a-zA-Z]+[0-9: ]*[0-9])[ ]+(([0-9]{2}:[0-9]{2})|[0-9]{4}) (.+)", $file, $regs)) { $type = (int) strpos("-dl", $regs[1]{0}); $tmp_array['line'] = $regs[0]; $tmp_array['type'] = $type; $tmp_array['rights'] = $regs[1]; $tmp_array['number'] = $regs[2]; $tmp_array['user'] = $regs[3]; $tmp_array['group'] = $regs[4]; $tmp_array['size'] = $regs[5]; $tmp_array['date'] = date("m-d",strtotime($regs[6])); $tmp_array['time'] = $regs[7]; $tmp_array['name'] = $regs[9]; } $dir_list[] = $tmp_array; } return $dir_list; } $buff = ftp_rawlist($cid, "/"); $items = itemize_dir($buff); ?> ergye
The previous regular expression is super, but does not take simlinks into account. Change [-d] to [-dl] and instead of indicating directories we should indicate the type of the items: 0 = file 1 = directory 2 = simlink <?php function itemize_dir($contents) { foreach ($contents as $file) { if(ereg("([-dl][rwxst-]+).* ([0-9]) ([a-zA-Z0-9]+).* ([a-zA-Z0-9]+).* ([0-9]*) ([a-zA-Z]+[0-9: ]*[0-9]) ([0-9]{2}:[0-9]{2}) (.+)", $file, $regs)) { $type = (int) strpos("-dl", $regs[1]{0}); $tmp_array['line'] = $regs[0]; $tmp_array['type'] = $type; $tmp_array['rights'] = $regs[1]; $tmp_array['number'] = $regs[2]; $tmp_array['user'] = $regs[3]; $tmp_array['group'] = $regs[4]; $tmp_array['size'] = $regs[5]; $tmp_array['date'] = date("m-d",strtotime($regs[6])); $tmp_array['time'] = $regs[7]; $tmp_array['name'] = $regs[8]; } $dir_list[] = $tmp_array; } return $dir_list; } $buff = ftp_rawlist($cid, "/"); $items = itemize_dir($buff); ?> mspreij
The following was inspired by a few others here, ofcourse ;-) Works for filenames with spaces (leading, trailing, consecutive and what not), formats the date a little taking year/time into account, leaves out items not in the $filetypes array below, and returns a nice nested assoc array: <?php $filetypes = array('-'=>'file', 'd'=>'directory', 'l'=>'link'); $c = ftp_connect('localhost'); ftp_login($c, 'jackcrow', 'banshee'); $data = ftp_rawlist($c, '/users/jackcrow'); foreach($data as $line) { if (substr(strtolower($line), 0, 5) == 'total') continue; # first line, skip it preg_match('/'. str_repeat('([^\s]+)\s+', 7) .'([^\s]+) (.*)/', $line, $matches); # Here be Dragons list($permissions, $children, $owner, $group, $size, $month, $day, $time, $name) = array_slice($matches, 1); # if it's not a file, directory or link, I don't really care to know about it :-) comment out the next line if you do if (! in_array($permissions[0], array_keys($filetypes))) continue; $type = $filetypes[$permissions[0]]; $date = date('d/m/y H:i', (strpos($time, ':') ? mktime(substr($time, 0, 2), substr($time, -2), 0, $month, $day) : mktime(0,0,0,$month, $day, $time) ) ); $files[$name] = array('type'=>$type, 'permissions'=>substr($permissions, 1), 'children'=>$children, 'owner'=>$owner, 'group'=>$group, 'size'=>$size, 'date'=>$date); } print_r($files); ?> (I'm using a pretty simple regex pattern (non-space-stuff, whitespace, non-space-stuff etc), but amazingly /it still works!/ K.I.S.S.! The time part in the pattern is done separately to make sure only 1 space is taken out before the filename, which might start with spaces for all you know) hazem dot khaled
that comment have 4 function the 1st function "<b>get_files</b>" get the list of files by the full bath "/www/ex/" and return 3 arrays dir = the directories in this directory with the time ,date ,more ... linke = the links in this directory with the time ,date ,more ... file = the files in this directory with the time ,date ,more ... the 2nd function "chmodnum" convert from "drwxrwxrwx" to "777" * i found it in php.net manual the 3rd function "get_size" convert from the byte to MB or GB or TB the 4th function "get_type" return if this file or directory or link the functions <?php function get_files($path = '') { if ($path == '' && !$_GET['path']) { $path = '/'; } elseif ($path == '') { $path = $_GET['path']; } //$all_folders = ftp_nlist($this->conection, $_GET['path']); $array = ftp_rawlist($this->conection, $path); if (is_array($array)) foreach ($array as $folder) { $struc = array(); $current = preg_split("/[\s]+/",$folder,9); $struc['perms'] = $current[0]; $struc['permsn']= chmodnum($current[0]); $struc['number']= $current[1]; $struc['owner'] = $current[2]; $struc['group'] = $current[3]; $struc['size'] = get_size($current[4]); $struc['month'] = $current[5]; $struc['day'] = $current[6]; $struc['time'] = $current[7]; $struc['name'] = str_replace('//','',$current[8]); //$struc['raw'] = $folder; if ($struc['name'] != '.' && $struc['name'] != '..' && get_type($struc['perms']) == "folder") { $folders[] = $struc; } elseif ($struc['name'] != '.' && $struc['name'] != '..' && get_type($struc['perms']) == "link") { $links[] = $struc; } elseif ($struc['name'] != '.' && $struc['name'] != '..') { $files[] = $struc; } } return array($folders,$links,$files); } function chmodnum($mode) { $realmode = ""; $legal = array("","w","r","x","-"); $attarray = preg_split("//",$mode); for($i=0;$i<count($attarray);$i++){ if($key = array_search($attarray[$i],$legal)){ $realmode .= $legal[$key]; } } $mode = str_pad($realmode,9,'-'); $trans = array('-'=>'0','r'=>'4','w'=>'2','x'=>'1'); $mode = strtr($mode,$trans); $newmode = ''; $newmode .= $mode[0]+$mode[1]+$mode[2]; $newmode .= $mode[3]+$mode[4]+$mode[5]; $newmode .= $mode[6]+$mode[7]+$mode[8]; return $newmode; } function get_size($size) { if ($size < 1024) { return round($size,2).' Byte'; } elseif ($size < (1024*1024)) { return round(($size/1024),2).' MB'; } elseif ($size < (1024*1024*1024)) { return round((($size/1024)/1024),2).' GB'; } elseif ($size < (1024*1024*1024*1024)) { return round(((($size/1024)/1024)/1024),2).' TB'; } } function get_type($perms) { if (substr($perms, 0, 1) == "d") { return 'folder'; } elseif (substr($perms, 0, 1) == "l") { return 'link'; } else { return 'file'; } } ?> jmv
Seems it doesn't have to be so complicated: $dirline=ereg_replace(" +",' ',$dirline); $isdir=0; if (ereg('^d',$dirline)) $isdir=1; list($permissions,$num,$owner,$group ,$size,$month,$day,$year_time,$name)=split(' ',$dirline); tig3r
Previous example (by davidknoll at o2 dot co dot uk) works well if ftp_systype() returned "UNIX", but sometimes I am experiencing "Windows_NT". Here is some improvement: <?php function parsed_listing($path) { $conn = ftp_connect(FTP_HOST); ftp_login($conn, FTP_USER, FTP_PASS); $systype = ftp_systype($conn_id); $list = ftp_rawlist($conn, "-a ".FTP_BASE.$path); ftp_close($conn); $i = 0; foreach ($list as $current) { switch ($systype) { case "Windows_NT": ereg("([0-9]{2})-([0-9]{2})-([0-9]{2}) +([0-9]{2}):([0-9]{2})(AM|PM) +([0-9]+|<DIR>) +(.+)",$current,$split); if (is_array($split)) { if ($split[3]<70) { $split[3]+=2000; } else { $split[3]+=1900; } // 4digit year fix $parsed[$i]['isdir'] = ($split[7]=="<DIR>"); $parsed[$i]['size'] = $split[7]; $parsed[$i]['month'] = $split[1]; $parsed[$i]['day'] = $split[2]; $parsed[$i]['time/year'] = $split[3]; $parsed[$i]['name'] = $split[8]; $i++; } break; case "UNIX": default: // etc. break; } } return $parsed; } ?> d dot lloyd
One comment regaring the method tig3r uses to determine the listing type. Windows servers can return a listing in unix format if the ftp server has been told to use unix formatting. The only robust solution I have is to try both ereg commands once and see which one successfully returns an array. 23-oct-2004 03:53
Note that there is no standard for the format, therefore don't be suprised when parsing routines for this work perfectly on some servers, and fail horribly on some.
eros
NO, NO, NO. The above examples are all wrong, the spaces given in array are not there "just because", its just a tabbed structure. In php we don't have structures like in c/cpp, but the following function will do the job. <?php function parse_rawlist( $array ) { for ( $i = 1; $i < count($array); $i++ ) { $current = $array[$i]; $structure[$i]['perms'] = substr($current, 0, 10); $structure[$i]['number'] = trim(substr($current, 11, 3)); $structure[$i]['owner'] = trim(substr($current, 15, 8)); $structure[$i]['group'] = trim(substr($current, 24, 8)); $structure[$i]['size'] = trim(substr($current, 33, 8)); $structure[$i]['month'] = trim(substr($current, 42, 3)); $structure[$i]['day'] = trim(substr($current, 46, 2)); $structure[$i]['time'] = substr($current, 49, 5); $structure[$i]['name'] = substr($current, 55, strlen($current) - 55); } return $structure; } ?> kioob
My project is to help users to use ftp functions with PHP. So I made a complet class for that : http://sourceforge.net/projects/kioobftp/ Enjoy ! greg
list all (including hidden files and dirs): <?php $contents = ftp_rawlist($conn_id, "-al ".$dir_name); ?> just as ftp command: LIST al "-aF " is equal to '-al', please refer to "ls --help" guru
Lets say only one of these scripts can accept filenames with spaces, but that script doesn't return all info that we may need, so i have modified a little bit one of my script and added some more regexp from here: <? $buff = ftp_rawlist($cid,"/"); foreach ($buff as $file) { if(ereg("([-d][rwxst-]+).* ([0-9]) ([a-zA-Z0-9]+).* ([a-zA-Z0-9]+).* ([0-9]*) ([a-zA-Z]+[0-9: ]*[0-9]) ([0-9]{2}:[0-9]{2}) (.+)",$file,$regs)) { if(substr($regs[1],0,1)=="d") $isdir=1; else $isdir=0; $tmp_array['line']=$regs[0]; $tmp_array['isdir']=$isdir; $tmp_array['rights']=$regs[1]; $tmp_array['number']=$regs[2]; $tmp_array['user']=$regs[3]; $tmp_array['group']=$regs[4]; $tmp_array['size']=$regs[5]; $tmp_array['date']=date("m-d",strtotime($regs[6])); $tmp_array['time']=$regs[7]; $tmp_array['name']=$regs[8]; } $dir_list[]=$tmp_array; } ?> The result is smth like that: 8 => array 'line' => '-rw-r--r-- 1 guru users 4 Sep 3 09:41 testas testas testas.txt' 'isdir' => 0 'rights' => '-rw-r--r--' 'number' => '1' 'user' => 'guru' 'group' => 'users' 'size' => '4' 'date' => '09-03' 'time' => '09:41' 'name' => 'testas testas testas.txt' 9 => array 'line' => 'drwxr-xr-x 3 guru users 4096 Aug 20 08:54 upload' 'isdir' => 1 'rights' => 'drwxr-xr-x' 'number' => '3' 'user' => 'guru' 'group' => 'users' 'size' => '4096' 'date' => '08-20' 'time' => '08:54' 'name' => 'upload' Home this will help someone maikdemaspam
L8 ereg mask (directory?, size, name): ereg("([-d])[rwxst-]{9}.* ([0-9]*) [a-zA-Z]+ [0-9: ]*[0-9] (.+)",$dirline,$regs); I've tried this, and it works fine if the name of the file has not a number in the first letter. for example, if I have a file named "1file.exe", it shows "file.exe"; and if I've a file named "010102.exe" it shows ".exe" only. I've improved it by doing this: if(ereg("([-d])[rwxst-]{9}.* ([0-9]*) ([a-zA-Z]+[0-9: ]*[0-9]) ([0-9]{2}:[0-9]{2}) (.+)",$dirline,$regs)) { if($regs[1]=="d") $dirinfo[0] = 1; $dirinfo[1] = $regs[2]; $dirinfo[2] = $regs[3]; $dirinfo[3] = $regs[4]; $dirinfo[4] = $regs[5]; } $dirinfo[0] => is a directory? (1=yes) $dirinfo[1] => file size $dirinfo[2] => file date $dirinfo[3] => file time $dirinfo[4] => file name and now works with all filename formats! 06-jan-2004 11:40
If you write <?php rawlist ($ftp, "-a"); ?> The command will be "LIST -a", so the retuned list will also contain hidden files like ".htaccess". In this case all files and folders of the current directory are contained. To list another folder, you must change to it with "ftp_chdir". svenne burner
If you want to use explode, for all files in a dir, or something.. Use: $rawlist[$i][$x] = ereg_replace( "([\x20]+)", "\x20", $rawlist[$i][$x]); /* $rawlist[$i][$x] = explode("\x20", $rawlist[$i][$x]); echo $rawlist[$i][$x][$k] . " "; */ Why?: The output prints a different amount of spaces. reg russia, vladimir
i'v wrote "php ftp recursive" function, you can use in any purposes you like. finally you will get an array of: 1) additional information like time an file's count 2) all files with extensions you defined with paths of course. the function is workable. $values = array( "sitename" => "abc.ru", "ftpserver" => "u12345.ftp.masterhost.ru", "ftpuser" => "u12345", "ftppassword" => "mypassword", "remotedir" => "abc.ru/www" ); function getAllFilesViaFTP($values){ $beginTime = time(); echo "connecting to ".$values['sitename']."\n"; // set up a connection or die if (!$conn_id = ftp_connect($values['ftpserver'])) return ("can't connect to ".$values['ftpserver']."\n"); // try to login if (!@ftp_login($conn_id, $values['ftpuser'], $values['ftppassword'])) echo "can't login to ".$values['sitename']." with entered ".$ftp_user." and password(...) \n"; // get the file list for $values['remotedir'] $fileList = ftp_rawlist($conn_id, $values['remotedir'], TRUE); // print_r($fileList); $fileList_c = count($fileList); $allFiles = $allFilesCount = $allUseFulFilesCount = null; $currentDir = $values['remotedir']; for ($i=0;$i<$fileList_c;$i++){ // change current dir, if current array element is an empty line if (!$fileList[$i]) $currentDir = $fileList[$i+1]; else{ $allFilesCount++; $fileInfo = list() = explode(" ", $fileList[$i]); // print_r($fileInfo); $fileName = $fileInfo[count($fileInfo) - 1]; if (preg_match("/\.php/", $fileName) or preg_match("/\.htm/", $fileName) or preg_match("/\.html/", $fileName)){ $allUseFulFilesCount++; $allFiles[] = preg_replace("/:/", "", $currentDir)."/".$fileName; } } } // close the connection ftp_close($conn_id); // time $fullTime = time() - $beginTime; $result = array ( "allFilesCount" => $allFilesCount, "allUseFulFilesCount" => $allUseFulFilesCount, "fullTime" => $fullTime, "fileList" => $allFiles ); return $result; } $fileList = getAllFilesViaFTP($values); print_r($fileList); john
I'm not a traditional programmer, so I often take a different approach then most programmers. Here's how I get file information from an FTP file list. It's very simple (which I like). Comments are welcome: // make your FTP connection calls here, then ... $contents = ftp_rawlist($ftp_id, "."); echo '<TABLE>'; foreach ($contents as $key => $value) { $info = explode(" ", $value); $clean = array(); foreach ($info as $key => $value) { if (!empty($value)) { $clean[] = $value; } } // end foreach loop 2 if ( ($clean[8] != ".") AND ($clean[8] != "..") AND ($clean[8] != "html") AND ($clean[8] != "logs") AND ($clean[8] != "protected") AND ($clean[8] != "sys") ) { echo '<TR>'; print "<TD WIDTH=\"40%\">$clean[8]</TD>"; // name of file print "<TD WIDTH=\"20%\" ALIGN=\"CENTER\">$clean[5] $clean[6] $clean[7]</TD>"; // date info // prep size $size = $clean[4]; $size = $size / 1000; $size = ceil($size); if ($size <= 0) { $size = 1; } if ($size >= 1000) { $measure = "MB"; $size = $size / 1000; } else { $measure = "K"; } print "<TD WIDTH=\"20%\" ALIGN=\"CENTER\">$size $measure</TD>"; // size echo '<TD WIDTH="20%" ALIGN="CENTER" BGCOLOR="#FFFFE6" CLASS="bodyBold">'; print "<A HREF=\"$PHP_SELF?Submit=DELETE&file=$clean[8]\">"; echo 'DELETE</A></TD>'; // link to delete file echo '</TR>'; } // end if } // end foreach loop 1 echo '</TABLE>'; naivesong
I'm afraid I forgot the "parsenext" function in my previous note. Here it is: <?php function parsenext ($s) { $k = strpos ($s, " "); $m = array(); $m[0] = substr($s, 0, $k); $m[1] = substr($s, $k+1); return $m; } ?> admin
I was having problems picking up the directories on a mac using cjacobsen at pge dot cl's (11-Jan-05) solution. Slight ammendment to the regexp works for me: ereg("([-dl][rwxstST-]+).* ?([0-9 ]* )?([a-zA-Z0-9]+).* ([a-zA-Z0-9]+).* ([0-9]*) ([a-zA-Z]+[0-9: ]*[0-9])[ ]+(([0-9]{2}:[0-9]{2})|[0-9]{4}) (.+)", $file, $regs) murasame
I tweaked the regexp above and used it like this in a for-loop: ... ereg("([-d])([rwxst-]{9}).* ([0-9]*) ([a-zA-Z]+[0-9: ]* [0-9]{2}:?[0-9]{2}) (.+)", $raw[$i], $regs) $out[] = array("is_dir" => ($regs[1] == "d") ? true : false, "mod" => $regs[2], "size" => $regs[3], "time" => $regs[4], "name" => $regs[5], "raw" => $regs[0]); ... the previous version couldn't handle old dates which are in format 'M d Y' instead of 'M d H:i' correctly josh
I fixed jmv AT jmvware DOT com's script: <?php $dirline=ereg_replace(" +",' ',$dirline); $isdir=0; if (ereg('^d',$dirline)) $isdir=1; list($permissions,$num,$owner,$group ,$size,$month,$day,$year_time,$name)=split(' ',$dirline); //added the next lines: $fix=explode(' ',$dirline); $fixsize=count($fix); if($fixsize > 8) { for($start=9;$start<$fixsize;$start++) { $name.=" " . $fix[$start]; } } ?> moonglobe3739 a t hotmail .com
hope this helps someone: <?php $list = ftp_rawlist($ftp_stream,$dir); $dirc = array(); foreach ($list as $file) { list($perms,$owner,$group,$size,$mtime,$fname) = preg_match('#^([bcdlsp-][rwxtTsS-]{9})\s+(?:[0-9]+)\s+'. '([a-zA-Z]+)\s+([a-zA-Z]+)\s+([0-9]+)\s+'. '([A-Z][a-z]+ [0-9]{1,2} [0-9]{4} [0-9]{2}:[0-9]{2}) (.*)$#',$file); $dirc[$fname]['permissions'] = $perms; $dirc[$fname]['owner'] = $owner; $dirc[$fname]['group'] = $group; $dirc[$fname]['size'] = $size; $dirc[$fname]['modtime'] = $mtime; } ?> soon7
Hi all ! ther is a litlle mistake in the naivesong 's message . Indeed , you stop to parse too early ... I tried and fix it like this : <? // getting the list $list = ftp_rawlist ($ftp_stream, $ftp_directory); $folders = array(); $files = array(); $links = array(); for ($i=0; $i<count($list); $i++) { //----convert tabs to blanks //----delete multiple blanks // Here begin my modifications list ($permissions, $list[$i]) = parsenext ($list[$i]); list ($number, $list[$i]) = parsenext ($list[$i]); list ($owner, $list[$i]) = parsenext ($list[$i]); list ($group, $list[$i]) = parsenext ($list[$i]); list ($size, $list[$i]) = parsenext ($list[$i]); list ($timeMonth,$list[$i]) = parsenext ($list[$i]); list ($timeDay,$list[$i]) = parsenext ($list[$i]); list ($timeTime,$list[$i]) = parsenext ($list[$i]); $filename=$list[$i]; // by taking $filename in last position , it works even if there is some space in its name //then we put it in the m array with the new things //----ok, put all this into the related array if ($filename != "." && $filename != "..") { $m = array(); $m["name"] = $filename; $m["link"] = $filelink; $m["size"] = afficherPoidsFichier($size); $m["month"] = $timeMonth; $m["day"] = $timeDay; $m["time"] = $timeTime; $m["owner"] = $owner; $m["group"] = $group; $m["permissions"] = $permissions; if (substr($permissions, 0, 1) == "d") $folders[count($folders)] = $m; else if (substr($permissions, 0, 1) == "l") $links[count($files)] = $m; else $files[count($files)] = $m; } } // you can sort $folders , $files , $links after if u want // afficherPoidsFichier($size) is a little function i found in this site at filesize() , works good ! // Just give the good size function afficherPoidsFichier($size) { $sizes = Array('o', 'Ko', 'Mo', 'Go'); $ext = $sizes[0]; for ($i=1; (($i < count($sizes)) && ($size >= 1024)); $i++) { $size = $size / 1024; $ext = $sizes[$i]; } return round($size, 2).' '.$ext; } ?> postmaster
Here we go for a 100% working code... :D <? [code] function cutspaces($str){ while(substr($str,0,1)==" "){$str=substr($str,1);} return $str;} [code] $folders=array(); $files=array(); for($i=0;$i<sizeof($list);$i++){ list($permissions,$next)=split(" ",$list[$i],2); list($num,$next)=split(" ",cutspaces($next),2); list($owner,$next)=split(" ",cutspaces($next),2); list($group,$next)=split(" ",cutspaces($next),2); list($size,$next)=split(" ",cutspaces($next),2); list($month,$next)=split(" ",cutspaces($next),2); list($day,$next)=split(" ",cutspaces($next),2); list($year_time,$filename)=split(" ",cutspaces($next),2); if($filename!="." && $filename!=".."){ if(substr($permissions,0,1)=="d"){ $folders[]=$filename; } else { $files[]=$filename;}}} sort($folders); sort($files); [code] ?> so this will simply "get" all the information WITHOUT being in any case interfered with some spaces, ... etc etc... It will even put files in a $files array and folders in a $folders array, and sort them, so you will be able of using all this later and: the "folders" will NOT contain "." and ".." ;) so you can use all this to make a beautiful FTP interface... later on you could for example put permissions and etc etc in other arrays to use them in your result... cute.... cjacobsen
Excelent expresion, but don't match SUID, SGUI and Sticky flags when 'x' is disabled. Fix it with [rwxstST-]. <?php function itemize_dir($contents) { foreach ($contents as $file) { if(ereg("([-dl][rwxstST-]+).* ([0-9]*) ([a-zA-Z0-9]+).* ([a-zA-Z0-9]+).* ([0-9]*) ([a-zA-Z]+[0-9: ]*[0-9])[ ]+(([0-9]{2}:[0-9]{2})|[0-9]{4}) (.+)", $file, $regs)) { $type = (int) strpos("-dl", $regs[1]{0}); $tmp_array['line'] = $regs[0]; $tmp_array['type'] = $type; $tmp_array['rights'] = $regs[1]; $tmp_array['number'] = $regs[2]; $tmp_array['user'] = $regs[3]; $tmp_array['group'] = $regs[4]; $tmp_array['size'] = $regs[5]; $tmp_array['date'] = date("m-d",strtotime($regs[6])); $tmp_array['time'] = $regs[7]; $tmp_array['name'] = $regs[9]; } $dir_list[] = $tmp_array; } return $dir_list; } $buff = ftp_rawlist($cid, "/"); $items = itemize_dir($buff); ?> postmaster
Another "formula" for decoding the rawlist: the ide is that normaly a "ls" contains info like below: <file rights> <number> <owner> <group> <date> <time> <filename> and: the "time" contains a ":" (which is NOT contained in any of the other infos -if we reversely read the array) and, in the case the "time" would not exist, i have done a "protection script" that would try to find out using the year... Yet that may NOT always work since a user name or group name MAY contain an item like "1999" etc... (and i did not check the date format reversely -on the filename first- since a probability of presence is higher of a date is MUCH higher in a filename) So here we go: <? [... code ...] $fnTest=array("198","199","200","201","202"); [... code ...] $j=0; $strrpos=strrpos($list[$i],":"); while($strrpos==0){ $strrpos=strpos($list[$i],$fnTest[$j]); $j++;} if($j){ $strrpos+=2+strlen($fnTest[$j]); }else{ $strrpos+=4;} $elmt=substr($list[$i],$strrpos); [... code ...] ?> and $elmt would *normally* contain the info we want... but i'm still working on it! php
An example script for rekursiv directory analysis ... interesting are the ereg functions for spliting the content based on the system type... (http://beben.lanparty.de/smint/ftp_rekdiranalys.phps) function analysedir($dirline) { global $systyp,$ftp_server,$stop; if(ereg("([-dl])[rwxst-]{9}",substr($dirline,0,10))) { $systyp = "UNIX"; } if(substr($dirline,0,5) == "total") { $dirinfo[0] = -1; } elseif($systyp=="Windows_NT") { if(ereg("[-0-9]+ *[0-9:]+[PA]?M? +<DIR> {10}(.*)",$dirline,$regs)) { $dirinfo[0] = 1; $dirinfo[1] = 0; $dirinfo[2] = $regs[1]; } elseif(ereg("[-0-9]+ *[0-9:]+[PA]?M? +([0-9]+) (.*)",$dirline,$regs)) { $dirinfo[0] = 0; $dirinfo[1] = $regs[1]; $dirinfo[2] = $regs[2]; } } elseif($systyp=="UNIX") { if(ereg("([-d])[rwxst-]{9}.* ([0-9]*) [a-zA-Z]+ [0-9: ]*[0-9] (.+)",$dirline,$regs)) { if($regs[1]=="d") $dirinfo[0] = 1; $dirinfo[1] = $regs[2]; $dirinfo[2] = $regs[3]; } } if(($dirinfo[2]==".")||($dirinfo[2]=="..")) $dirinfo[0]=0; // array -> 0 = switch, directory or not // array -> 1 = filesize (if dir =0) // array -> 2 = filename or dirname return $dirinfo; } function rekdir($dir) { global $conn_id,$filetyps,$exectyps,$ftp_server,$banlist,$size,$ssize; echo "<b>$dir</b> "; $dirlist = ftp_rawlist($conn_id,""); for($i=0;$i<count($dirlist);$i++) { $dirinfo = analysedir($dirlist[$i]); if($dirinfo[0]==1) { $newdir = "$dir/$dirinfo[2]"; if(($dirinfo[2]=="~")||(substr($dirinfo[2],0,1)==" ")) $chdir=ftp_chdir($conn_id,$newdir); else $chdir=ftp_chdir($conn_id,$dirinfo[2]); $stop = 0; // for($k=0;($k<count($banlist))&&(!$stop);$k++) { // if(strpos($newdir,$banlist[$k])!=0) $stop=1; // } if(!$stop && $chdir) { rekdir($newdir); } if(!ftp_chdir($conn_id,$dir)) ftp_cdup($conn_id); } elseif($dirinfo[0]==0) { echo "$dirinfo[2] "; $size += $dirinfo[1]; } } } $conn_id = ftp_connect($ftp_server); $login_result = @ftp_login($conn_id, $user, $password); if ($login_result) { $real_systyp = ftp_systype($conn_id); $systyp = $real_systyp; echo "scanning... $systyp "; rekdir(""); ftp_quit($conn_id); } |
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 |