PHP를 사용하여 디렉토리의 모든 파일 이름 얻기


87

어떤 이유로 다음 코드로 파일 이름에 '1'이 계속 표시됩니다.

if (is_dir($log_directory))
{
    if ($handle = opendir($log_directory))
    {
        while($file = readdir($handle) !== FALSE)
        {
            $results_array[] = $file;
        }
        closedir($handle);
    }
}

$ results_array의 각 요소를 에코 할 때 파일 이름이 아닌 '1'이 표시됩니다. 파일 이름은 어떻게 얻습니까?


1
glob 을 사용하는 몇 가지 옵션이 있습니다 .
allnightgrocery


1
포스터의 문제는 할당의 우선 순위가 매우 낮기 때문에 '! =='연산자가 먼저 평가되고 해당 작업의 이진 결과가 $ file에 할당된다는 것입니다. 필요한 유일한 수정 사항은 ($ file = readdir ($ handle))! == FALSE "
Omn


(70) 69 투표에서 나는 행크 무디의 반대 같은 느낌
찰리

답변:


167

open / readdir에 신경 쓰지 말고 glob대신 사용하십시오 .

foreach(glob($log_directory.'/*.*') as $file) {
    ...
}

24
array_filter(..., 'is_file')질문에서 파일을 요구하므로 해당 glob 을 감싸고 싶을 수 있습니다 .
salathe

23
모든 파일 이름의 형식은 *.*: 그냥 사용하는 *대신.
jameshfisher 2014

확장자 목록에있는 모든 파일을 어떻게 가져올 수 있습니까? 예를 들어 모든 .php 및 .js 파일을 원하는 경우?
Nis

3
예,이 답변은 그다지 강력하지 않습니다. 파일에는 확장자가 필요하지 않으며 디렉토리 이름은 something.something. 그것은 사용하기 좋습니다 array_filterglob($log_directory.'/*').
Andrew

나는 간단한 대답이 필요했고 내 사용 사례에 대한 모든 관련 파일이 *.*. 더 강력한 표현이 더 나은 답이 될 것입니다.
TecBrat

49

SPL 스타일 :

foreach (new DirectoryIterator(__DIR__) as $file) {
  if ($file->isFile()) {
      print $file->getFilename() . "\n";
  }
}

사용할 수있는 메서드 목록은 DirectoryIteratorSplFileInfo 클래스를 확인하십시오 .


전체 경로 대신 파일과 이름 만 얻을 수있는 좋은 방법입니다. 감사합니다!
Chris

1
예. 전체 경로의 경우 다음을 사용할 수 있습니다 getPathname. php.net/manual/en/splfileinfo.getpathname.php
Ilija

18

당신은 포위 할 필요가 $file = readdir($handle)괄호.

여기 있습니다 :

$log_directory = 'your_dir_name_here';

$results_array = array();

if (is_dir($log_directory))
{
        if ($handle = opendir($log_directory))
        {
                //Notice the parentheses I added:
                while(($file = readdir($handle)) !== FALSE)
                {
                        $results_array[] = $file;
                }
                closedir($handle);
        }
}

//Output findings
foreach($results_array as $value)
{
    echo $value . '<br />';
}


14

받아 들여지는 답변에는 두 가지 중요한 단점이 있으므로 정답을 찾고있는 신규 사용자를 위해 개선 된 답변을 게시하고 있습니다.

foreach (array_filter(glob('/Path/To/*'), 'is_file') as $file)
{
    // Do something with $file
}
  1. 일부 디렉터리도 반환 할 수 있으므로 globe함수 결과를 필터링해야 합니다 is_file.
  2. 모든 파일 .의 이름에 a가있는 것은 아니므 */*로 일반적으로 패턴이 엉망입니다.

이것은 나를 위해 일한 깨끗한 실행입니다. 이전 답변은 내가 원하지 않는 결과로 디렉토리를 보여주었습니다.
AWP

더 많은 찬성표가 필요합니다! 실제로 (Windows에서) basename($file)파일 이름이있는 전체 경로 대신 파일 이름 만 가져와야했습니다.
Pauloco

10

이 작업을 수행하는 더 작은 코드가 있습니다.

$path = "Pending2Post/";
$files = scandir($path);
foreach ($files as &$value) {
    echo "<a href='http://localhost/".$value."' target='_blank' >".$value."</a><br/><br/>";
}

"."라는 두 개의 가비지 파일을 제외한 모든 파일을 반환합니다. 그리고 "..". 이름이 "."인 파일이 없습니다. 내 디렉토리에 ".."
kamranbhatti585

1
$ files = array_diff (scandir ($ path), array ( '.', '..')); 사용 위의 오류를 해결하기 위해 논의했습니다.
kamranbhatti585

좋은. 파일의 확장자를 제거하려면 어떻게합니까? ( .php각 파일 에서 제거해야 합니다.)
KSPR

8

일부 OS에서 당신은 얻을 . ..하고 .DS_Store그럼 우리는 그래서 우리가 숨길하자를 사용할 수 없습니다.

먼저 파일에 대한 모든 정보를 얻으십시오. scandir()

// Folder where you want to get all files names from
$dir = "uploads/";

/* Hide this */
$hideName = array('.','..','.DS_Store');    

// Sort in ascending order - this is default
$files = scandir($dir);
/* While this to there no more files are */
foreach($files as $filename) {
    if(!in_array($filename, $hideName)){
       /* echo the name of the files */
       echo "$filename<br>";
    }
}

4

운영자의 정확성 때문입니다. 다음으로 변경해보십시오.

while(($file = readdir($handle)) !== FALSE)
{
    $results_array[] = $file;
}
closedir($handle);

2

glob()FilesystemIterator예 :

/* 
 * glob() examples
 */

// get the array of full paths
$result = glob( 'path/*' );

// get the array of file names
$result = array_map( function( $item ) {
    return basename( $item );
}, glob( 'path/*' ) );


/* 
 * FilesystemIterator examples
 */

// get the array of file names by using FilesystemIterator and array_map()
$result = array_map( function( $item ) {
    // $item: SplFileInfo object
    return $item->getFilename();
}, iterator_to_array( new FilesystemIterator( 'path' ), false ) );

// get the array of file names by using FilesystemIterator and iterator_apply() filter
$it = new FilesystemIterator( 'path' );
iterator_apply( 
    $it, 
    function( $item, &$result ) {
        // $item: FilesystemIterator object that points to current element
        $result[] = (string) $item;
        // The function must return TRUE in order to continue iterating
        return true;
    }, 
    array( $it, &$result )
);

1

scandir(Path)기능을 시도해 볼 수 있습니다. 빠르고 쉽게 구현할 수 있습니다.

통사론:

$files = scandir("somePath");

이 함수는 파일 목록을 배열로 반환합니다.

결과를 보려면 시도해 볼 수 있습니다.

var_dump($files);

또는

foreach($files as $file)
{ 
echo $file."< br>";
} 



0

이 코드를 사용합니다.

<?php
    $directory = "Images";
    echo "<div id='images'><p>$directory ...<p>";
    $Files = glob("Images/S*.jpg");
    foreach ($Files as $file) {
        echo "$file<br>";
    }
    echo "</div>";
?>


0

디렉토리에 포함 된 모든 파일을 탐색하는 재귀 코드 ( '$ path'에는 디렉토리 경로가 포함됨) :

function explore_directory($path)
{
    $scans = scandir($path);

    foreach($scans as $scan)
    {
        $new_path = $path.$scan;

        if(is_dir($new_path))
        {
            $new_path = $new_path."/";
            explore_directory($new_path);
        }
        else // A file
        {
            /*
                  Body of code
            */
        }
    }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.