디렉토리의 모든 파일을 반복하는 PHP 스크립트?


131

디렉토리의 모든 파일을 반복하는 PHP 스크립트를 찾고 있으므로 형식, 인쇄 또는 링크에 파일 이름 추가와 같은 파일 이름으로 작업을 수행 할 수 있습니다. 이름, 유형 또는 생성 / 추가 / 수정 날짜별로 파일을 정렬하고 싶습니다. (멋진 디렉토리 "인덱스"를 생각하십시오.) 또한 스크립트 자체 나 다른 "시스템"파일과 같은 파일 목록에 제외를 추가하고 싶습니다. (좋아요 ..."디렉토리".)

스크립트를 수정할 수 있기 때문에 PHP 문서를보고 직접 작성하는 방법을 배우는 데 더 관심이 있습니다. 기존 스크립트, 튜토리얼 및 기타 사항이 있으면 알려주십시오.


답변:


245

DirectoryIterator를 사용할 수 있습니다 . PHP 매뉴얼의 예 :

<?php
$dir = new DirectoryIterator(dirname(__FILE__));
foreach ($dir as $fileinfo) {
    if (!$fileinfo->isDot()) {
        var_dump($fileinfo->getFilename());
    }
}
?>

3
참고 : 많은 서버에 SPL이 설치되어 있지 않으므로 DirectoryIterator 클래스를 사용할 수 없습니다 (아래의 다른 게시물 참조). 가능하다면 이것을 사용하십시오!
NexusRex

4
참고 [2] : dirname()위 함수는 경로에 상관없이 상위 폴더를 가져옵니다. 필자의 경우 dirname이 디렉토리 이름 / 경로의 래퍼라고 가정했기 때문에 필요하지 않았습니다.
willdanceforfun

또한 dirname이 큰 파일 시스템 인 경우 메모리 문제가 분명합니다. 1 백만 개의 파일을 사용하는 경우 memory_limit에 ~ 512M 램이 필요합니다.
abkrim

1
/home/examples/banana.jpg사용 과 같은 완전한 경로가 필요한 경우$fileinfo->getPathname()
mgutt

! 당신은 디렉토리에 회피 행동을 $ fileinfo-> ISDIR ()를 사용할 수 있습니다
LeChatNoir

44

DirectoryIterator 클래스에 액세스 할 수 없으면 다음을 시도하십시오.

<?php
$path = "/path/to/files";

if ($handle = opendir($path)) {
    while (false !== ($file = readdir($handle))) {
        if ('.' === $file) continue;
        if ('..' === $file) continue;

        // do something with the file
    }
    closedir($handle);
}
?>

4
당신이 접근 할 수없는 상황을 말할 수 있습니까?
Jochem Kuijpers

12
많은 레거시 응용 프로그램은 DirectoryIterator에 액세스 할 수없는 PHP 4를 사용합니다.
Joseph Callaars

1
왜 '.' === $ 파일? 이것은 자바가 아니다.
Dave Heq

2
Dave ... 아니, 점과 일치하고 PHP에서 일치하지 않으면 계속되지 않습니다. ==와 ===의 차이점을 검색하십시오.
JSG

22

scandir()기능을 사용하십시오 :

<?php
    $directory = '/path/to/files';

    if (!is_dir($directory)) {
        exit('Invalid diretory path');
    }

    $files = array();
    foreach (scandir($directory) as $file) {
        if ($file !== '.' && $file !== '..') {
            $files[] = $file;
        }
    }

    var_dump($files);
?>

18

을 사용할 수도 있습니다 FilesystemIterator. 그런 다음 더 적은 코드가 필요 DirectoryIterator하고, 자동으로 제거 .하고 ...

// Let's traverse the images directory
$fileSystemIterator = new FilesystemIterator('images');

$entries = array();
foreach ($fileSystemIterator as $fileInfo){
    $entries[] = $fileInfo->getFilename();
}

var_dump($entries);

//OUTPUT
object(FilesystemIterator)[1]

array (size=14)
  0 => string 'aa[1].jpg' (length=9)
  1 => string 'Chrysanthemum.jpg' (length=17)
  2 => string 'Desert.jpg' (length=10)
  3 => string 'giphy_billclinton_sad.gif' (length=25)
  4 => string 'giphy_shut_your.gif' (length=19)
  5 => string 'Hydrangeas.jpg' (length=14)
  6 => string 'Jellyfish.jpg' (length=13)
  7 => string 'Koala.jpg' (length=9)
  8 => string 'Lighthouse.jpg' (length=14)
  9 => string 'Penguins.jpg' (length=12)
  10 => string 'pnggrad16rgb.png' (length=16)
  11 => string 'pnggrad16rgba.png' (length=17)
  12 => string 'pnggradHDrgba.png' (length=17)
  13 => string 'Tulips.jpg' (length=10)

링크 : http://php.net/manual/en/class.filesystemiterator.php


5

이 코드를 사용하여 디렉토리를 반복적 으로 반복 할 수 있습니다 .

$path = "/home/myhome";
$rdi = new RecursiveDirectoryIterator($path, RecursiveDirectoryIterator::KEY_AS_PATHNAME);
foreach (new RecursiveIteratorIterator($rdi, RecursiveIteratorIterator::SELF_FIRST) as $file => $info) {
    echo $file."\n";
}

2

glob () 에는 정렬 및 패턴 일치에 대한 조항이 있습니다. 반환 값은 배열이므로 필요한 다른 모든 작업을 수행 할 수 있습니다.


1
많은 파일을 다루지 않는 한 이것은 좋습니다.>> 10,000. 메모리가 부족합니다.
NexusRex

@NexusRex : 데이터베이스에서 10,000 개의 레코드를 읽지 말아야하지만 문제가있는 한 범위를
벗어납니다

동의했다! 데이터베이스에서 읽는 경우 "limit"로 페이지를 매길 수 있습니다. 반복 할 5 백만 개의 XML 파일이있는 디렉토리가있는 경우에는 운이 없습니다.
NexusRex

SPL GlobIterator가 있습니다.
przemo_li

2

완성도를 높이려면 (이것은 트래픽이 많은 페이지 인 것 같습니다) 좋은 이전 dir()기능을 잊지 마십시오 .

$entries = [];
$d = dir("/"); // dir to scan
while (false !== ($entry = $d->read())) { // mind the strict bool check!
    if ($entry[0] == '.') continue; // ignore anything starting with a dot
    $entries[] = $entry;
}
$d->close();
sort($entries); // or whatever desired

print_r($entries);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.