PHP 디렉터리에있는 파일 수 계산


107

저는 약간 새로운 프로젝트를 진행하고 있습니다. 특정 디렉토리에 얼마나 많은 파일이 있는지 알고 싶었습니다.

<div id="header">
<?php 
    $dir = opendir('uploads/'); # This is the directory it will count from
    $i = 0; # Integer starts at 0 before counting

    # While false is not equal to the filedirectory
    while (false !== ($file = readdir($dir))) { 
        if (!in_array($file, array('.', '..') and !is_dir($file)) $i++;
    }

    echo "There were $i files"; # Prints out how many were in the directory
?>
</div>

이것이 내가 지금까지 (검색에서) 가진 것입니다. 그러나 제대로 나타나지 않습니까? 몇 가지 메모를 추가 했으므로 자유롭게 제거 할 수 있습니다. 가능한 한 최대한 이해할 수 있도록합니다.

더 많은 정보가 필요하거나이 내용을 충분히 설명하지 않은 것 같다면 언제든지 말씀해주십시오.


4
count(scandir("uploads/")) - 2그 루프보다 같은 관용구를 사용하는 것이 더 짧을 것입니다.
mario

@mario 조심해! scandir 은 좋지만 -2가 최고는 아닙니다. 루트 디렉토리에 있거나 디렉토리에 디렉토리가있을 수 있습니다.- Laurent Brieu는 ./ .. 및 디렉토리에 대한 좋은 검사를 받았습니다. :)
jave.web

답변:


262

다음을 수행 할 수 있습니다.

$fi = new FilesystemIterator(__DIR__, FilesystemIterator::SKIP_DOTS);
printf("There were %d Files", iterator_count($fi));

22
이것은 귀엽기 때문에 +1하지만 대부분의 PHP 개발자에게는 상당히 혼란 스럽거나 읽을 수 없다고 생각할 수 있습니다. 다른 답변의 접근 방식 중 하나를 사용합니다.
user428517

유용했지만 내가 질문했을 때 읽기가 쉽지는 않았습니다. 그래도 PHP에 대한 지식이 향상되었습니다. 나는 이것을 찬성하지 않았습니다.
Bradly Spicer 2013

2
질문자가 특정 파일을 제외 할 수있는보다 맞춤화 된 버전을 원하지 않는 한 이것은 허용되는 대답이어야합니다.
Abhishek Madhani 2014

1
사람들이 이것이 일부 개발자에게 혼란 스럽다고 말하는 것을 감안할 때 네임 스페이스를 사용하는 경우 (이 메서드는 어떤 경우에도 최신 버전의 PHP가 필요하므로) 네임 스페이스도 지정해야합니다. $ fi = new \ FilesystemIterator ( DIR , \ FilesystemIterator :: SKIP_DOTS);
graemeboy

2
FilesystemIterator::SKIP_DOTS어쨌든 기본값이므로 플래그를 전달할 필요가 없습니다 .
Eborbob

70

다음과 같이 파일 수를 얻을 수 있습니다.

$directory = "/path/to/dir/";
$filecount = 0;
$files = glob($directory . "*");
if ($files){
 $filecount = count($files);
}
echo "There were $filecount files";

(가) 어디에 "*"당신이 좋아 원하는 경우 특정 파일 유형에 해당을 변경할 수 있습니다 "*.jpg"또는 당신은이 같은 여러 파일 형식을 할 수있는 :

glob($directory . "*.{jpg,png,gif}",GLOB_BRACE)

GLOB_BRACE'A', 'B'또는 'C'에 대한 매치 플래그 팽창 {A, B, C}


3
훌륭합니다. 파일을 필터링하고 계산하는이 접근 방식에는 많은 가능성이 있습니다. :) 간단한 루프를 만들고 여러 조건을 만드는 것이 좋습니다 ... 그러나 어떻게 그 디렉토리 내에 다른 디렉토리를 포함하여 모든 것을 계산할 수 있습니까? 개수에서 파일을 제외하고 디렉토리를 제외 하시겠습니까?
The Bumpaster

1
@TheBumpaster는 glob을 사용하여 하위 디렉터리를 스캔하는 방법에 대한이 SO 질문 / 답변을 확인하십시오. stackoverflow.com/q/12109042/276250
JKirchartz

2
이 솔루션이 작동하지 않는 경우 __DIR__ . 앞에 추가하십시오 "/path/to/dir/"( __DIR__ . "/path/to/dir/")
dnns

@dnns 사실 아무것도 추가 /path/to/dir첫째 있기 때문에, 그것을 실패를 /의미 starting from root dir. 있는 경우 path/to/dir예, __DIR__ . '/path/to/dir'도움이 될 것입니다 (이 경우 /이후에 사용해야 함__DIR__
Justinas 19-02-22

43

이 시도.

// Directory
$directory = "/dir";

// Returns array of files
$files = scandir($directory);

// Count number of files and store them to variable..
$num_files = count($files)-2;

'.'는 세지 않습니다. 그리고 '..'.


5
어쩌면 $num_files = count($files) - 2;? 때문에의 .뿐만 아니라..
하벨 록

이 두 가지 '.'도 계산합니다. 및 '..'
로랑 Brieu

7
의 없애 ...= $ 파일이 시도array_diff( scandir("/dir"), array(".", "..") );
JKirchartz

2
array_slice(scandir($directory),2)
Spooky

42

다음이 있어야합니다.

<div id="header">
<?php 
    // integer starts at 0 before counting
    $i = 0; 
    $dir = 'uploads/';
    if ($handle = opendir($dir)) {
        while (($file = readdir($handle)) !== false){
            if (!in_array($file, array('.', '..')) && !is_dir($dir.$file)) 
                $i++;
        }
    }
    // prints out how many were in the directory
    echo "There were $i files";
?>
</div>

동일한 코드가 아닌 작업을 수행합니다 $ 파일 = readdir을 ($ DH)해야한다 $ 파일 = readdir을 ($ DIR)
마르코 페이스

2
OP가 최소한의 텍스트로 만든 차이점 / 실수를 지적하는 것이 좋을 것입니다 (그리고 무엇보다도 도움이 될 것입니다).
Havelock

1
안녕하세요, 감사합니다. 여전히 나에게 나타나지는 않지만 내 스타일 시트 또는 그 라인을 따라가는 것과 관련이 있다고 생각합니다. 어느 쪽이든 귀하의 도움에 감사드립니다. 편집 : 고정 :) 대단히 감사합니다!
Bradly Spicer 2012 년

디렉토리를 닫는 것을 잊지 마세요 :)
jave.web

16

제 생각에 가장 좋은 대답은 :

$num = count(glob("/exact/path/to/files/" . "*"));
echo $num;
  • 그것은 중요하지 않습니다. 그리고 ..
  • 하나의 라이너
  • 난 자랑스러워

PHP 문서가 같은 디렉토리에 있다면 "folder / *"를 사용할 수 있다는 것을 깨달았습니다!

하나 라이너는 사실은 X3 만들 ... 평판이 2 배를 보상해야
baron_bartek

1
무슨 말이야? "그것은 중요하지 않습니다".
habibhassani

13

이것도 필요했기 때문에 어떤 대안이 가장 빠른지 궁금했습니다.

원하는 것은 파일 수뿐이라면 Baba의 솔루션은 다른 솔루션 보다 훨씬 빠릅니다. 나는 꽤 놀랐습니다.

직접 시도해보십시오.

<?php
define('MYDIR', '...');

foreach (array(1, 2, 3) as $i)
{
    $t = microtime(true);
    $count = run($i);
    echo "$i: $count (".(microtime(true) - $t)." s)\n";
}

function run ($n)
{
    $func = "countFiles$n";
    $x = 0;
    for ($f = 0; $f < 5000; $f++)
        $x = $func();
    return $x;
}

function countFiles1 ()
{
    $dir = opendir(MYDIR);
    $c = 0;
    while (($file = readdir($dir)) !== false)
        if (!in_array($file, array('.', '..')))
            $c++;
    closedir($dir);
    return $c;
}

function countFiles2 ()
{
    chdir(MYDIR);
    return count(glob("*"));
}

function countFiles3 () // Fastest method
{
    $f = new FilesystemIterator(MYDIR, FilesystemIterator::SKIP_DOTS);
    return iterator_count($f);
}
?>

테스트 실행 : (분명히 glob()도트 파일은 포함하지 않음)

1: 99 (0.4815571308136 s)
2: 98 (0.96104407310486 s)
3: 99 (0.26513481140137 s)

마지막으로 결과를 언급하지 않았으므로 어느 것이 더 빠릅니까?
Alex

Baba의 솔루션이 가장 빠르다고 말했지만 당연히 결과에 대해 더 명확해야했습니다. 지금 수정되었습니다.
vbwx 2014

12

작동 데모

<?php

$directory = "../images/team/harry/"; // dir location
if (glob($directory . "*.*") != false)
{
 $filecount = count(glob($directory . "*.*"));
 echo $filecount;
}
else
{
 echo 0;
}

?>

디렉토리에 많은 파일이 있으면 glob ()을 두 번 호출하지 않을 것입니다. 대신 첫 번째 glob의 결과를 변수에 할당하고이 변수에 count를 사용합니다.
Konrad Gałęzowski

5

나는 이것을 사용한다 :

count(glob("yourdir/*",GLOB_BRACE))

이것은 나를 위해 일하는 첫 번째이지만 계산 된 모든 파일이 이미지라는 보장을 제공하지 않는다는 문제가 있습니다.
Sterling Diaz

1
<?php echo(count(array_slice(scandir($directory),2))); ?>

array_slicesubstr함수 와 유사 하게 작동하지만 배열에서만 작동합니다.

예를 들어 다음은 배열에서 처음 두 개의 배열 키를 잘라냅니다.

$key_zero_one = array_slice($someArray, 0, 2);

첫 번째 예와 같이 첫 번째 매개 변수를 생략하면 배열에 처음 두 개의 키 / 값 쌍 * ( '.'및 '..')이 포함되지 않습니다.


1
이것은 기본적으로 다른 포스터에서 이미 제안한 것과 동일한 답변입니다. 답변을 개선하거나 이미 논의한 것 외에 다른 정보를 추가 할 수 있습니까?
Joe Miller

더 나은 ..? 평소보다 조금 더 php.net 매뉴얼을 읽게하십시오. :)
으시시

1

누군가에게 유용 할 수도 있습니다. Windows 시스템에서는 dir- 명령을 호출하여 Windows가 작업을 수행하도록 할 수 있습니다. 나는 같은 절대 경로를 사용합니다 E:/mydir/mysubdir.

<?php 
$mydir='E:/mydir/mysubdir';
$dir=str_replace('/','\\',$mydir);
$total = exec('dir '.$dir.' /b/a-d | find /v /c "::"');

0
$it = new filesystemiterator(dirname("Enter directory here"));
printf("There were %d Files", iterator_count($it));
echo("<br/>");
    foreach ($it as $fileinfo) {
        echo $fileinfo->getFilename() . "<br/>\n";
    } 

dirname에 디렉토리를 입력하면 작동합니다. 마법이 일어나게하십시오.


0
$files = glob('uploads/*');
$count = 0;
$totalCount = 0;
$subFileCount = 0;
foreach ($files as $file) 
{  
    global $count, $totalCount;
    if(is_dir($file))
    {
        $totalCount += getFileCount($file);
    }
    if(is_file($file))
    {
        $count++;  
    }  
}

function getFileCount($dir)
{
    global $subFileCount;
    if(is_dir($dir))
    {
        $subfiles = glob($dir.'/*');
        if(count($subfiles))
        {      
            foreach ($subfiles as $file) 
            {
                getFileCount($file);
            }
        }
    }
    if(is_file($dir))
    {
        $subFileCount++;
    }
    return $subFileCount;
}

$totalFilesCount = $count + $totalCount; 
echo 'Total Files Count ' . $totalFilesCount;

0

수락 된 답변에 따라 다음은 디렉토리의 모든 파일을 반복적으로 계산하는 방법입니다.

iterator_count(
    new \RecursiveIteratorIterator(
        new \RecursiveDirectoryIterator('/your/directory/here/', \FilesystemIterator::SKIP_DOTS)
    )
)

0

상당히 빠른 PHP Linux 기능이 있습니다. 조금 더럽지 만 작업이 완료됩니다!

$ dir-디렉토리 경로

$ type-f, d 또는 false (기본값)

f-파일 수만 반환

d-폴더 수만 반환

false-총 파일 및 폴더 수를 반환합니다.

function folderfiles($dir, $type=false) {
    $f = escapeshellarg($dir);
    if($type == 'f') {
        $io = popen ( '/usr/bin/find ' . $f . ' -type f | wc -l', 'r' );
    } elseif($type == 'd') {
        $io = popen ( '/usr/bin/find ' . $f . ' -type d | wc -l', 'r' );
    } else {
        $io = popen ( '/usr/bin/find ' . $f . ' | wc -l', 'r' );
    }

    $size = fgets ( $io, 4096);
    pclose ( $io );
    return $size;
}

필요에 맞게 조정할 수 있습니다.

Windows에서는 작동하지 않습니다.


-2
  simple code add for file .php then your folder which number of file to count its      

    $directory = "images/icons";
    $files = scandir($directory);
    for($i = 0 ; $i < count($files) ; $i++){
        if($files[$i] !='.' && $files[$i] !='..')
        { echo $files[$i]; echo "<br>";
            $file_new[] = $files[$i];
        }
    }
    echo $num_files = count($file_new);

간단한 추가 완료 ....


코드에 설명을 추가하여 더 명확하게 만드세요.
Alex.K.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.