[Patch] Net_FTP to allow Windows_NT ftp directories. Parser uses array callback.

From: Date: Mon, 22 Dec 2003 18:21:35 +0000
Subject: [Patch] Net_FTP to allow Windows_NT ftp directories. Parser uses array callback.
Groups: php.pear.dev 
Request: Send a blank email to pear-dev+get-24605@lists.php.net to get a copy of this message
--- FTP.php.bak 2003-12-22 11:42:18.989016000 -0600 +++ FTP.php 2003-12-22 12:07:30.883012800 -0600 @@ -123,6 +123,17 @@ var $_file_extensions; /** + * System type used by list parser + * + * System type used by list parser + * + * @access private + * @var string + */ + + var $_systype; + + /** * This generates a new FTP-Object * This generates a new FTP-Object. The FTP-connection will not be established, yet. * You can leave $host and $port blank, if you want. The $host will not be set @@ -220,6 +231,7 @@ if (!$res) { return $this->raiseError("Unable to login", 0); } else { + $this->_systype = @ftp_systype($this->_handle); return true; } } @@ -909,6 +921,62 @@ } /** + * UNIX + * 0 1 2 3 4 5 6 + * 0123456789012345678901234567890123456789012345678901234567890 + * drwxr-xr-x 2 user group 512 Dec 1 16:27 mm + * -r--r--r-- 1 user group 4038 Nov 12 14:15 patel + * + * @access private + * @param string $entry String entry + * @return array $entry Parsed entry + */ + + function _list_and_parse_UNIX( &$entry ) + { + if (substr($entry,50,1)==':') { // if time + $stamp = strtotime(substr_replace(substr($entry, 41, 12),date(' Y'),6,0)); + } else { + $stamp = strtotime(substr($entry, 41, 12)); + } + $date = date('Y-m-d H:i', $stamp); + $entry = array("name" => substr($entry, 54), + "size" => (int)substr($entry, 33, 7), + "rights" => substr($entry, 1, 9), + "user" => trim(substr($entry, 15, 8)), + "group" => trim(substr($entry, 24, 8)), + "files_inside" => (int)substr($entry, 11, 3), + "stamp" => $stamp, + "date" => $date, + "is_dir" => substr($entry, 0, 1)=='d'); + + } + + /** + * Windows_NT + * 0 1 2 3 4 5 6 + * 0123456789012345678901234567890123456789012345678901234567890 + * 05-27-03 02:09PM <DIR> analog + * 05-27-03 02:09PM 122058 c01lst.htm + * + * @access private + * @param string $entry String entry + * @return array $entry Parsed entry + */ + + function _list_and_parse_Windows_NT( &$entry ) + { + $stamp = strtotime(str_replace('-','/',substr($entry, 0, 17))); + $date = date('Y-m-d H:i', $stamp); + $entry = array("name" => substr($entry, 39), + "size" => (int)substr($entry, 24, 14), + "stamp" => $stamp, + "date" => $date, + "is_dir" => substr($entry, 24, 5)=='<DIR>'); + } + + + /** * This lists up the directory-content and parses the items into well-formated arrays * This lists up the directory-content and parses the items into well-formated arrays * The results of this array are sorted (dirs on top, sorted by name; @@ -923,44 +991,17 @@ $dirs_list = array(); $files_list = array(); $dir_list = ftp_rawlist($this->_handle, $dir); + + array_walk($dir_list, array(&$this, '_list_and_parse_'.$this->_systype)); + foreach ($dir_list as $entry) { - // ([1] = directory?, [2] = rights, [3] = files below, [4] = user, - // [5] = group, [6] = size, [7] = date, [8] = name) - $res_1 = @ereg(NET_FTP_DIR_EREG ,$entry,$eregs); - if (!$res_1) { - var_dump($entry); - return $this->raiseError("Raw directory-list in wrong format.", 0); - } - $is_dir = (@trim($eregs[1]) == "d"); - // snip link-locations (have to clean that up later) - if (@trim($eregs[1]) == "l") { - preg_match("/(.*) -> (.*)/", $eregs[8], $matches); - $eregs[8] = $matches[1]; - } - - $date = $this->_parse_date($eregs[7]); - // $date = $eregs[7]; - if (!$date) { - return $this->raiseError("Can not parse date from raw directory-list on '$dir'.", 0); - } - if ($is_dir) { - $dirs_list[] = array("name" => $eregs[8], - "rights" => $eregs[2], - "user" => $eregs[4], - "group" => $eregs[5], - "files_inside" => $eregs[3], - "date" => $date, - "is_dir" => $is_dir); + if ($entry['is_dir']) { + $dirs_list[] = $entry; } else { - $files_list[] = array("name" => $eregs[8], - "size" => (int)$eregs[6], - "rights" => $eregs[2], - "user" => $eregs[4], - "group" => $eregs[5], - "date" => $date, - "is_dir" => $is_dir); + $files_list[] = $entry; } } + @usort($dirs_list, array("Net_FTP", "_nat_sort")); @usort($files_list, array("Net_FTP", "_nat_sort")); $res["dirs"] = $dirs_list;

« previous php.pear.dev (#24605) next »