2008-10-22 8 views
12

디렉토리의 이미지 수를 찾고 변수로 출력하는 더 좋고/더 쉬운 방법이 있습니까?PHP를 사용하여 폴더 내의 총 파일 수를 반환하십시오.

function dirCount($dir) { 
    $x = 0; 
    while (($file = readdir($dir)) !== false) { 
    if (isImage($file)) {$x = $x + 1} 
    } 
    return $x; 
} 

이것은 이렇게 오래 걸리는 것처럼 보입니다. 더 간단한 방법이 없습니까?

참고 : isImage() 함수는 파일이 이미지 인 경우 true를 반환합니다.

답변

25

체크 아웃 DirectoryIterator에 대한 표준 PHP 라이브러리 (일명 SPL).

$dir = new DirectoryIterator('/path/to/dir'); 
foreach($dir as $file){ 
    $x += (isImage($file)) ? 1 : 0; 
} 

(문서화되지 않은 기능 iterator_count() 만 호출 참고로이 아마 최고의하지 지금은 상상 위해에 의존하고 어쨌든 ..와 같은 보이지 않는 것들을 필터링해야합니다.)

+2

하나의 디렉토리에있는 파일의 모든 종류의 수를 얻기 위해 다음 사용합니다. 나는 당신의 솔루션이 갈 길이라고 생각합니다. – Stuart

+0

AWSOME! 그냥 내가 뭘 찾고 있었는지! – PHLAK

0

답변은 얻을 수있는만큼 간단합니다. 나는 PHP 나 Perl에서 더 짧은 방법을 생각할 수 없다.

isImage()의 복잡한 정도에 따라 Linux를 사용하는 경우 ls, wc 및 grep과 관련된 system/exec 명령을 사용할 수 있습니다.

아무튼 나는 당신이 갖고있는 것이 충분하다고 생각합니다. 한 번만 함수를 작성하면됩니다.

+0

나는 System and Exec (보안 우선!)을 피하려고 노력하지만, 그 점을 염두에 두겠다. – PHLAK

+0

isImage() 함수와 현재 메서드가 느리다면 ls를 수행하고 wc -l로 파이프하는 것이 더 빠를 것이라고 생각합니다. 나는 당신의 현재 방법이 느린 경우에만 그렇게 할 것입니다. 왜냐하면 system/exec를 사용하지 않기위한 보안상의 이유로 여러분의 권리가 있기 때문입니다. – GnomeCubed

13

이것은 당신의 dir에있는 것의 개수를 알려줍니다. 나는 당신이 aaasssllleeelppppppzzzzzzzzzzzzz를 추락 할 것처럼 이미지 만 세는 것에 관한 부분을 남겨 둘 것입니다.

iterator_count(new DirectoryIterator('path/to/dir/')); 
+1

lol nice one –

3

당신이 glob 사용할 수 ...

$count = 0; 
foreach (glob("*.*") as $file) { 
    if (isImage($file)) ++$count; 
} 

나, 나는이 사용자의 요구에 맞게 얼마나 잘 모르겠지만, 당신이 할 수있는 :

$count = count(glob("*.{jpg,png,gif,bmp}")); 
1

당신을 FilterIterator 클래스를 확장하여 isImage 함수를 사용하여 DirectoryIterator의 내용을 필터링하기 위해 SPL을 사용할 수도 있습니다.

class ImageIterator extends FilterIterator { 

    public function __construct($path) 
    { 
     parent::__construct(new DirectoryIterator($path)); 
    } 

    public function accept() 
    { 
     return isImage($this->getInnerIterator()); 
    } 
} 

그런 다음 iterator_count를 사용 (또는 Countable 인터페이스를 구현하고 기본 count 기능을 사용) 이미지의 수를 결정하기 위해 수 있습니다. 예를 들어 :

$images = new ImageIterator('/path/to/images'); 
printf('Found %d images!', iterator_count($images)); 

는이 코드를 사용해야하는 방법에 따라,이 방법을 사용하면, 깔끔하게 한 장소에 싸서 모든 것을 가지고하는 ImageIterator 클래스로 isImage 기능을 이동하는 것이 더 적합 할 수 있습니다.

3

상기의 코드

$count = count(glob("*.{jpg,png,gif,bmp}")); 

가장 최선이지만,이 말에 GLOB_BRACE 플래그를 추가 할 경우는 {도트 JPG, PNG는 GIF} 비트에만 작동합니다 :

$count = count(glob("*.{jpg,png,gif,bmp}", GLOB_BRACE)); 
5

전 그것을 좋아하십시오 :

$files = scandir($dir); 
$x = count($files); 
echo $x; 

그러나 또한 그것을 세십시오. 그리고 ..

+0

또한 폴더를 검색하므로'$ files' 배열을 반복하고'is_file'을 사용하여 파일인지 확인해야합니다. – Brian

0

나는 이것을 사용하여 다음 디렉토리 이외의 디렉토리에있는 모든 파일 수를 반환한다. 그리고 ..

return count(glob("/path/to/file/[!\.]*")); 

여기 파일 매칭 목적 a good list of glob filters이다.

0
$nfiles = glob("/path/to/file/[!\\.]*"); 

if ($nfiles !== FALSE){ 

    return count($nfiles); 

} else { 

    return 0; 

} 
1

는 나는 내가 게시에 대한 뭔지 Laravel

$dir = public_path('img/'); 
    $files = glob($dir . '*.*'); 

    if ($files !== false) 
    { 
     $total_count = count($files); 
     return $totalCount; 
    } 
    else 
    { 
     return 0; 
    }