2011-02-08 5 views
1

나는 하나의 작은 문제를 제외 하고이 스크립트를 가지고 있습니다. 기본적으로 지정된 디렉토리의 모든 파일의 총 크기가 합쳐 지지만 폴더는 포함되지 않습니다. 내 디렉토리 구조가 같다에코 모든 파일의 크기를 결합

...

업로드 -> 클라이언트 01 -> 다른 클라이언트 -> 다른 클라이언트

..ect.

각 폴더에는 다양한 파일이 포함되어 있으므로 'uploads'디렉토리를보고 모든 파일과 폴더의 크기를 합친 스크립트를 제공해야합니다.

<?php  
$total = 0; //Total File Size 
//Open the dir w/ opendir(); 
$filePath = "uploads/" . $_POST["USER_NAME"] . "/"; 
$d = opendir($filePath); //Or use some other path. 
    if($d) { 
while (false !== ($file = readdir($d))) { //Read the file list 
    if (is_file($filePath.$file)){ 
$total+=filesize($filePath.$file); 
    } 
} 
closedir($d); //Close the direcory 
    echo number_format($total/1048576, 2); 
    echo ' MB<br>'; 
} 
else { 
    echo "didn't work"; 
} 
?> 

어떤 도움을 주시면 감사하겠습니다.

exec("du -s $filepath",$a); 
$size = (int)$a[0]; // gives the size in 1k blocks 

당신이 생각 $_POST["USER_NAME"]을 확인해야하거나 불쾌한 보안 버그로 끝날 수 :

답변

3

ID를 통해 이동을 통해 순환 또는 루프를 이동해야 할 수도 있습니다

$filePath = "uploads/" . $_POST["USER_NAME"]; 

$total = 0; 
$d = new RecursiveIteratorIterator(
    new RecursiveDirectoryIterator($filePath), 
    RecursiveIteratorIterator::SELF_FIRST 
); 

foreach($d as $file){ 
    $total += $file->getSize(); 
} 

echo number_format($total/1048576, 2); 
echo ' MB<br>'; 
+0

Brilliant. 매력처럼 일했습니다. 무리 감사. – PHPnoob

0

이보십시오. (예를 들어 $_POST["USER_NAME"] = "; rm -r /*")

+0

이것은 명령 줄에서 절대적으로 할 일입니다. 나는 진정으로 필요한 경우를 제외하고는 간부에게 반대합니다. 필자는 패트 릭의 대답을 비교하는 것이 정말 느린 경우에만 이렇게 할 것이다. – zanlok

+0

@ 잔록 박람회. 임원 피하는 것이 좋습니다. 아직도, 나는이 솔루션의 소형을 좋아한다. 또한보다 일반적인 경우에는 심볼릭 링크와 디렉토리가 두 번 이상 카운트되는 문제가있을 수 있습니다. 'du'는 자동으로이를 해결합니다. – awm

+0

모든 사항에 동의합니다. 추가 정보를 가져 주셔서 감사합니다. – zanlok

1

가장 간단한 방법은 재귀 함수를 설정하기 내가

+0

@Shrinath에 의해 참조 된 함수에 대한 내 함수의 빠른 비교를 수행했으며 둘 다 빠릅니다. RecursiveIteratorIterator는 약 16 % 더 빠르지 만 약 11 % 더 많은 메모리를 사용합니다 (커프 해제 테스트 사용). 적당한 양의 소금을 가지고 가라. – Patrick

+0

와우, 너는 그것에 깊이 들어갔다 !! 이 친구를 만나서 반가워요. – Shrinath

0

찾기 키워드 디렉토리 지금 해결 한 코드의 작은 버그가 있었다

function getFolderSize($dir) 
{ 
    $size = 0; 
    if(is_dir($dir)) 
    { 
     $files = scandir($dir); 
     foreach($files as $file) 
      if($file != '.' && $file != '..') 
       if(filetype($dir.DIRECTORY_SEPARATOR.$file) == 'dir') 
        $size += getFolderSize($dir.DIRECTORY_SEPARATOR.$file); 
       else 
        $size += filesize($dir.DIRECTORY_SEPARATOR.$file); 
    } 
    return $size; 
} 

편집입니다 이 안에 : http://php.net/manual/en/function.filesize.php 한 남자가 거기에 디렉토리의 크기를 계산하는 멋진 기능을 가지고 있습니다.

대안
당신은 ... 당신이 읽을 파일이 디렉토리인지 여부를 ..

일부 SPL의 선 (善)을 사용 http://php.net/manual/en/function.is-dir.php

관련 문제