2012-04-18 112 views
3

背景: 我有一个匿名登录的ftp服务器,ftp_nlist只是按字母顺序列出文件,我想根据最近修改日期,最近的第一个来获取文件列表。我尝试了ftp_exec($ conn,“ls -t”),但是出现Permission Denied错误,不知道为什么它没有工作。那么我正在使用php-cli,文件数量是几千,我只想使用最近的文件。获取原始列表以及查找数组元素的日期部分可能会有所帮助,但我希望有一个简单的方法。当我通过终端命令登录时,ls -t工作得很好。所以想知道为什么ftp_exec不工作。如何按修改日期通过php对文件进行排序

寻求一个简单的建议。

在此先感谢。

回答

14

如果你只是想通过最后修改日期的文件进行排序,你可以使用

ftp_nlist($conn, '-t .'); 

这不会告诉你什么每个文件的日期是,虽然。

如果您还想获取修改日期,则可以使用ftp_rawlist并解析输出。下面是一个简单的例子,我张罗:

$list = ftp_rawlist($ftp, '.'); 

$results = array(); 
foreach ($list as $line) { 
    list($perms, $links, $user, $group, $size, $d1, $d2, $d3, $name) = 
     preg_split('/\s+/', $line, 9); 
    $stamp = strtotime(implode(' ', array($d1, $d2, $d3))); 
    $results[] = array('name' => $name, 'timestamp' => $stamp); 
} 

usort($results, function($a, $b) { return $a['timestamp'] - $b['timestamp']; }); 

此时$results包含在上升最后修改时间排序的列表;反转排序功能以最近修改的第一种格式获取列表。

注:ftp_rawlist不提供确切修改时间戳,所以这个代码可能并不总是准确工作。你还应该验证你的FTP服务器的输出是否与这个算法一致,并且包括一些理智检查,以确保事情在未来保持这种状态。

+0

谢谢,我想,我会做与ftp_nlist($ conn,'-t。'); 但是是否有可能扭转这个顺序,目前这是最新的,最近我最先想要的。可以通过颠倒数组来完成,但也可以通过询问。我想我可以联合使用ftp_mdtm()。我只是想筛选最新的文件并对其进行处理, – Nitesh 2012-04-18 10:37:32

+1

@Nitesh:您可以使用''-rt''来颠倒顺序。 – Jon 2012-04-18 10:53:21

1

试试我为这样的任务写的这个函数。它被设计为与本地文件系统的工作,但它会与ftp://网址的工作,只要你的系统有allow_url_fopen启用(虽然DIR_SORT_ATIMEDIR_SORT_CTIME将无法​​正常工作):

// Constants to make usage more reader-friendly 
define('DIR_SORT_NAME', 1); 
define('DIR_SORT_SIZE', 2); 
define('DIR_SORT_ATIME', 3); 
define('DIR_SORT_MTIME', 4); 
define('DIR_SORT_CTIME', 5); 

function readdir_sorted_array ($dir, $sortCol = DIR_SORT_NAME, $sortDir = SORT_ASC) { 

    // Validate arguments 
    $dir = rtrim(str_replace('\\', '/', $dir), '/'); 
    $sortCol = (int) ($sortCol >= 1 && $sortCol <= 5) ? $sortCol : 1; 
    $sortDir = ($sortDir == SORT_DESC) ? SORT_DESC : SORT_ASC; 
    $name = $size = $aTime = $mTime = $cTime = $table = array(); 

    // Open the directory, return FALSE if we can't 
    if (!is_dir($dir) || (!$dp = opendir($dir))) return FALSE; 

    // Fetch a list of files in the directory and get stats 
    for ($i = 0; ($file = readdir($dp)) !== FALSE; $i++) { 
    if (!in_array($file, array('.','..'))) { 
     $path = "$dir/$file"; 
     $row = array('name'=>$file,'size'=>filesize($path),'atime'=>fileatime($path),'mtime'=>filemtime($path),'ctime'=>filectime($path)); 
     $name[$i] = $row['name']; 
     $size[$i] = $row['size']; 
     $aTime[$i] = $row['atime']; 
     $mTime[$i] = $row['mtime']; 
     $cTime[$i] = $row['ctime']; 
     $table[$i] = $row; 
    } 
    } 

    // Sort the results 
    switch ($sortCol) { 
    case DIR_SORT_NAME: 
     array_multisort($name, $sortDir, $table); 
     break; 
    case DIR_SORT_SIZE: 
     array_multisort($size, $sortDir, $name, SORT_ASC, $table); 
     break; 
    case DIR_SORT_ATIME: 
     array_multisort($aTime, $sortDir, $name, SORT_ASC, $table); 
     break; 
    case DIR_SORT_MTIME: 
     array_multisort($mTime, $sortDir, $name, SORT_ASC, $table); 
     break; 
    case DIR_SORT_CTIME: 
     array_multisort($cTime, $sortDir, $name, SORT_ASC, $table); 
     break; 
    } 

    // Return the result 
    return $table; 

} 

返回的一个排序的关联数组文件在给定的路径$dir

0

好像“ftp_nlist”第二ARG采用相同的ARGS作为Linux的“LS”命令(OP不应该使用“ls”的,只是开关)

$dir_list = ftp_nlist($ftp_conn_id, '-rtla .'); 
print_r($dir_list); 
相关问题