ftp_rawlist

(PHP 3 >= 3.0.13, PHP 4, PHP 5)

ftp_rawlist -- Возвращает список файлов в заданной директории

Описание

array ftp_rawlist ( resource ftp_stream, string directory [, bool recursive] )

ftp_rawlist() отправляет FTP серверу команду LIST и возвращает результат в виде массива.

Список параметров

ftp_stream

Идентификатор соединения с FTP сервером

directory

Имя директории на сервере

recursive

Если передано значение TRUE, серверу будет отправлена команда LIST -R

Возвращаемые значения

Возвращает массив, каждый элемент которого содержит одну строку ответа сервера. Ответ сервера не интерпретируется. Для определения того, как следует интерпретировать результат, можно использовать результат функции ftp_systype().

Примеры

Пример 1. Пример использования ftp_rawlist()

<?php

// установка соединения
$conn_id = ftp_connect($ftp_server);

// проверка имени пользователя и пароля
$login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);

// получение списка файлов директори /
$buff = ftp_rawlist($conn_id, '/');

// закрытие соединения
ftp_close($conn_id);

// вывод буфера
var_dump($buff);
?>

    Вывод вышеприведенного примера будет подобен следующему:    

array(3) {
  [0]=>
  string(65) "drwxr-x---   3 vincent  vincent      4096 Jul 12 12:16 public_ftp"
  [1]=>
  string(66) "drwxr-x---  15 vincent  vincent      4096 Nov  3 21:31 public_html"
  [2]=>
  string(73) "lrwxrwxrwx   1 vincent  vincent        11 Jul 12 12:16 www -> public_html"
}

Список изменений

ВерсияОписание
4.3.0 Добавлен аргумент recursive.

Смотрите также

ftp_nlist()



ftp_rawlist
admin at mikeholloway dot co dot uk
03-Dec-2005 02:38
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)
d dot lloyd at tnw dot tudelft dot nl
27-Sep-2005 06:22
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.
tig3r at poczta dot onet dot pl
18-Aug-2005 03:31
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;
}
?>
davidknoll at o2 dot co dot uk
14-Jul-2005 04:00
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;
}
?>
nate at 8networks dot com
07-May-2005 12:41
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"); }
john at nm-design dot com
29-Apr-2005 10:14
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>';
marc dot peterlongo at francetelecom dot com
03-Feb-2005 02:57
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
cjacobsen at pge dot cl
11-Jan-2005 05:44
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);

?>
greg at upsdn dot net
19-Dec-2004 11:58
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"
greg at upsdn dot net
25-Nov-2004 10:55
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);

?>
Jonathan Almarez
24-Nov-2004 03:16
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);

?>
22-Oct-2004 07: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.
ergye at yahoo dot com
29-Sep-2004 09:52
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);

?>
guru at virusas dot lt
03-Sep-2004 03:31
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
eros at speedy dot com dot ar
01-Sep-2004 02:06
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;

}

?>
soon7 at wanadoo dot fr
14-Jul-2004 02:17
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;
}
?>
naivesong at matiasmoreno dot com dot ar
25-Mar-2004 08:53
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;
   }

?>
naivesong at matiasmoreno dot com dot ar
24-Mar-2004 10:41
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).
josh at snaphat dot com
29-Jan-2004 07:23
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];
  }
 }
?>
06-Jan-2004 03: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".
moonglobe3739 [ A t ] hotmail .com
01-Nov-2003 04:16
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;
}
?>
postmaster at alishomepage dot com
19-Oct-2003 05:39
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....
postmaster at alishomepage dot com
19-Oct-2003 05:05
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!
Svenne Burner
01-Aug-2003 06:12
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] . "<br>";
*/

Why?:
The output prints a different amount of spaces.
jmv AT jmvware DOT com
14-May-2003 02:27
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);
kioob at wanadoo dot fr
10-Sep-2002 03:02
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 !
murasame at danzers dot org
02-Jun-2002 06:11
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
maikdemaSPAM at yahooMAPS dot com
28-Mar-2002 03:27
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!
ryan at wonko dot com
20-Mar-2002 07:32
[[ 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
cialdi at firenze dot net
29-Jun-2001 09:24
the second parameter accepts also standard arguments of /bin/ls command like "-l" or "-t"
php at smintman dot com
26-May-2001 06:35
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><br>";
  
   $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]<br>";
          
           $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<br>";

   rekdir("");

   ftp_quit($conn_id);
}

<ftp_rawftp_rename>
 Last updated: Tue, 15 Nov 2005