2017-09-21 6 views
1

私はPHPでオンラインアプリケーションを作成しています。この中に私はディレクトリに関数を持たせる必要があり、そのフォルダ内のすべてのファイルを数えます。そのフォルダ内のすべてのフォルダ、およびそのフォルダ内のすべてのファイルとサブファイルがカウントされるまで、サブディレクトリ内のすべてのフォルダなどが含まれます。PHP - scandir()とチェックカウント中に無限ループする

私は複数の方法を試しましたが、私自身の研究から、ほとんどの人がそれを試みようとしましたが、私の方法では成功しません。

ここで私が現在使用してコードです:($ UNIQUEKEYパラメータは、問題はすでにそのアウトデバッグされていません。)

//Get file count of user 
function getFolderFileCount($uniqueKey){ 
    $totalCount = 0; 
    $directory = "data/storage/uploads/" . $uniqueKey; 
    $dirContents = scandir($directory); 
    foreach($dirContents as $row){ 
     if(is_dir($row)){ 
      $totalCount += getFolderFileCount($directory . "/" . $row); 
      $totalCount++; 
     }else{ 
      $totalCount++; 
     } 
    } 
    return $totalCount - 2; 
} 

次のように私のディレクトリのツリーがある:

は、

-www
--access
--code.php(< - コードから実行される場合、これはある)
---データ
----ストレージ
-----アップロード
------ user500493(< - これは私がのファイル数を必要とするよりも、$ UNIQUEKEY変数ので、フォルダです)私は私のエラーログに取得しています

エラーがある:あなたが再び代わりに$uniqueKey '/' $rowの機能に$directory変数を送信している https://pastebin.com/g3jGD7u8

答えて

2

。 2番目のループでは、'data/storage/uploads/data/storage/uploads/{$uniqueKey}/{$row}'にアクセスしようとします。

//Get file count of user 
function getFolderFileCount($uniqueKey){ 
    $totalCount = 0; 
    $directory = "data/storage/uploads/" . $uniqueKey; 

    $dirContents = scandir($directory); 
    foreach($dirContents as $row){ 
     if($row == '.' || $row == '..') 
      continue; 
     if(is_dir($directory. $row)){ 
      $totalCount += getFolderFileCount($uniqueKey . "/" . $row); 
      $totalCount++; 
     }else{ 
      $totalCount++; 
     } 
    } 
    return $totalCount; 
} 

編集:コードは、同様にuser500493フォルダ内のサブフォルダを検討します。
PHP 7.1.9-1でいくつかのテストを行いました。
is_dir()のパラメータは、ファイルまたはディレクトリ名のみであるため、$rowだけでなく、フォルダのパスでなければなりません。

+0

私は関数を再呼び出しするときに何もせずに$ directory変数を削除しましたが、今度はコンソールにまだスパムが掛かりますが、今回はスキャンしようとしているのでscandir()ファイル名が長すぎます: data/storage/uploads/user500493 /./././././././././././././。 "無限にサブディレクトリ "test"をスキャンする必要がある場合 – Jooshinator

+0

"。"とは異なる$行のテストと ".."、それはすべきです。ディレクトリをスキャンするときに何が起こっているのかを理解するために、私は 'exit(var_dump($ row))'を実行します。 – faabiopontes

+0

私はあなたが言ったことをしており、ループエラーはもはや存在しません。唯一のことは実際にはdosntは実際にはサブディレクトリ内のファイルの量をチェックするようです。 – Jooshinator