2016-03-30 61 views
1

私はすべてのディレクトリとサブディレクトリを配列内の私のFTPサーバーから取得する再帰関数を作ろうとしています。PHPのFTP再帰的なディレクトリリスト

私はウェブ上で見つけた多くの機能を試しました。

public function getAllSubDirFiles() { 
    $dir = array("."); 
    $a = count($dir); 
    $i = 0; 
    $depth = 20; 
    $b = 0; 
    while (($a != $b) && ($i < $depth)) { 
     $i++; 
     $a = count($dir); 
     foreach ($dir as $d) { 
      $ftp_dir = $d . "/"; 
      $newdir = ftp_nlist($this->connectionId, $ftp_dir); 
      foreach ($newdir as $key => $x) { 

       if ((strpos($x, ".")) || (strpos($x, ".") === 0)) { 
        unset($newdir[$key]); 
       } elseif (!in_array($x, $dir)) { 
        $dir[] = $x; 
       } 
      } 
     } 
     $b = count($dir); 
    } 
    return $dir ; 

} 

この機能の問題は、ディレクトリに "。"が付いていないことです。その名前で、ルートディレクトリにあるすべてのファイルもディレクトリとみなされます。だから、私は関数を調整してこれを得ました:

public function getAllSubDirFiles($ip, $id, $pw) { 
    $dir = array("."); 
    $a = count($dir); 
    $i = 0; 
    $depth = 20; 
    $b =0; 
    while (($a != $b) && ($i < $depth)) { 
     $i++; 
     $a = count($dir); 
     foreach ($dir as $d) { 
      $ftp_dir = $d . "/"; 
      $newdir = ftp_nlist($this->connectionId, $ftp_dir); 
      foreach ($newdir as $key => $x) { 
       if (!is_dir('ftp://'.$id.':'.$pw.'@'.$ip.'/'.$x)) { 
        unset($newdir[$key]); 
       } elseif (!in_array($x, $dir)) { 
        $dir[] = $x; 
       } 
      } 
     } 
     $b = count($dir); 
    } 
    return $dir ; 

} 

これはかなりうまくいくが、私が望む結果を与える。それはとても遅いので使用できません。

また、私はftp_rawlistで作業を試みましたが、それは恐ろしく遅いという同じ欠点があります。

public function getAllSubDirFiles() { 
    $dir = array("."); 
    $a = count($dir); 
    $i = 0; 
    $depth = 20; 
    $b = 0; 
    while (($a != $b) && ($i < $depth)) { 
     $i++; 
     $a = count($dir); 
     foreach ($dir as $d) { 
      $ftp_dir = $d . "/"; 
      $newdir = $this->getFtp_rawlist('/' . $ftp_dir); 
      foreach ($newdir as $key => $x) { 

       $firstChar = substr($newdir[$key][0], 0, 1); 

       $a = 8; 
        while ($a < count($newdir[$key])) { 

         if ($a == 8) { 
          $fileName = $ftp_dir . '/' . $newdir[$key][$a]; 
         } else { 
          $fileName = $fileName . ' ' . $newdir[$key][$a]; 
         } 
         $a++; 
        } 

       if ($firstChar != 'd') { 
        unset($newdir[$key]); 
       } elseif (!in_array($fileName, $dir)) { 

        $dir[] = $fileName; 
       } 
      } 
     } 
     $b = count($dir); 
    } 
    return $dir; 
} 

public function getFtp_rawlist($dir) { 

    $newArr = array(); 

    $arr = ftp_rawlist($this->connectionId, $dir); 

    foreach ($arr as $value) { 

     $stringArr = explode(" ", $value); 

     $newArr[] = array_values(array_filter($stringArr)); 
    } 
    return $newArr; 
} 

私はここ数日間、この問題に悩まされています。私は絶望的です。いずれかの提案がある場合はお知らせください

答えて

0

ファイルシステムのエントリに関する詳細を取得するディレクトリリスティングコマンドを使用する必要があります。これにより、エントリがファイルかフォルダかを検出できるようになります。

ftp_rawlistを使用してください。これには、リストが未定義構文を有するという欠点がある。しかし、1つのサーバー(または1つのサーバー・タイプのみ)に接続する場合、大きな問題ではない場合。

あなたはすでにftp_rawlistを使用しています。しかし、あなたのコードは間違っています。同じフォルダを何度も何度も読んでいます。 **私はあなたが私は私の** ftp_rawlistを取得するために使用する機能を見ることができるように、私のコードをedittedまし

function ftp_list_files_recursive($ftp_stream, $path) 
{ 
    $lines = ftp_rawlist($ftp_stream, $path); 

    $result = array(); 

    foreach ($lines as $line) 
    { 
     $tokens = explode(" ", $line); 
     $name = $tokens[count($tokens) - 1]; 
     $type = $tokens[0][0]; 
     $filepath = $path . "/" . $name; 

     if ($type == 'd') 
     { 
      $result = array_merge($result, ftp_list_files_recursive($ftp_stream, $filepath)); 
     } 
     else 
     { 
      $result[] = $filepath; 
     } 
    } 
    return $result; 
} 
+0

は、のような単純な再帰を使用してください。 この関数をこの** $ newdir = $ this-> getFtp_rawlist( '/'。$ ftp_dir); **で呼び出し、同じ接続を使用していますが、この関数を毎回呼び出す必要がありますそこにはサブディレクトリがあります –

+0

私はすでにそれを試みましたが、悲惨に失敗しました。あなたは簡単な例を知っていますか? –

+0

ありがとう!私はそれが動作するようにすることができると思います。 –

関連する問題