5

背景: 私は匿名ログイン ftp サーバーを持っています。ftp_exec($conn, "ls -t") を試しましたが、アクセスが拒否されたというエラーが表示され、なぜ機能しないのかわかりません。私は php-cli を使用していますが、ファイルの数は数千に上ります。最近のファイルを操作したいだけです。生のリストを取得し、配列要素の日付部分を見つけることが役立つかもしれませんが、簡単な方法があることを願っています. 端末コマンド ls -t でログインすると、問題なく動作します。なぜ ftp_exec が機能しないのか疑問に思っています。

簡単な提案を求めています。

前もって感謝します。

4

3 に答える 3

16

最終更新日のみでファイルを並べ替えたい場合は、次を使用できます

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 サーバーからの出力がこのアルゴリズムと一致していることを確認し、将来もそのように維持されるようにいくつかの健全性チェックを含める必要があります。

于 2012-04-18T10:18:07.693 に答える
1

そのようなタスクのために私が書いたこの関数を試してください。ローカル ファイル システムで動作するように設計されていftp://ますが、システムが有効になっている限り、URL で動作しますallow_url_fopen(ただしDIR_SORT_ATIME、動作しDIR_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

于 2012-04-18T10:21:11.677 に答える
0

「ftp_nlist」の2番目の引数は、Linuxの「ls」コマンドと同じ引数を取るようです(OPは「ls」を使用するべきではなく、スイッチのみを使用する必要があります)

$dir_list = ftp_nlist($ftp_conn_id, '-rtla .');
print_r($dir_list);
于 2013-01-15T02:18:02.150 に答える