2012-04-18 79 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); 
相關問題