2010-07-03 3 views
2

PHP에서 디렉토리가 얼마나 큰지를 알아볼 수 있어야하는 간단한 파일 캐싱 엔진을 작성하고 있습니다. 내가 찾고있는 것은 단순히 Unix의 du 명령과 같은 것으로 디렉토리의 총 파일 크기를 인쇄하는 것입니다. 나는 그것을 직접 작성할 수있다. 그러나 다른 누군가가 이미 심볼릭 링크를 반복하고 다루는 등의 모든 문제를 이미 파악했다면 그것은 훌륭 할 것이다. 이의 라인을 따라PHP는`du` 명령과 동일합니까?

+0

'system ('du');': p – kennytm

+0

@Kenny는 가장 쉽지만 이동성이 가장 적은 솔루션입니다. – Gordon

답변

5

뭔가 :

$iterator = new RecursiveIteratorIterator(
       new RecursiveDirectoryIterator(
        '/path/to/a/folder')); 

반복자는 당신이 반복적으로 지정된 폴더 및 하위 폴더를 반복하자 SplFileInfo 객체를 반환합니다. 기본 옵션은 나뭇잎을 반환하는 것입니다 (예 : 파일이 아닌 디렉토리 항목, 그래서 당신은 할 수 있습니다 :

$size = 0; 
foreach($iterator as $file) { 
    $size += filesize($file->getRealPath()); 
} 
echo $size; 

파일에 getRealPath()을 사용하여, 우리는 심볼릭 링크가 확장되어 있는지 확인합니다. 그러나 이것이 디렉토리에 대한 심볼릭 링크를 고려할 지 확실하지 않습니다. 나는 그들이 잎으로 여겨지는지 여부를 모른다.

class FileSizeIterator extends RecursiveIteratorIterator 
{ 
    public function current() { 
     return filesize($this->getInnerIterator()->current()->getRealpath()); 
    } 
} 

echo array_sum(iterator_to_array(new FileSizeIterator(
     new RecursiveDirectoryIterator('/path/to/a/folder')))); 

당신은 그것의 확인 du에 결과를 비교 할 수 있습니다 : 사용자 정의 반복자를 사용하여

echo array_reduce(iterator_to_array($iterator), function($size, $file) { 
    $size += filesize($file->getRealPath()); 
    return $size; 
}); 

그리고 또 다른 방법 :

어쨌든

, 여기에 람다를 사용하여 기능적 접근 방식 옳은.

+0

어떻게 심볼릭 링크를 처리합니까? – erjiang

+0

@mazin PHP가 디렉토리에 대한 심볼릭 링크를 처리하는 방법과 경로를 트래버스하는 방법을 잘 모르겠습니다. 파일에 대한 심볼릭 링크의 경우 getRealPath가 충분해야합니다. 위의 방법 중 하나를 시도해보고 'du'결과와 일치하는지 확인하십시오. – Gordon