PHPを使用してディレクトリ内のすべてのファイルの名前を取得する


88

何らかの理由で、次のコードでファイル名の「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


69票から70票へ。ハンク・ムーディの反対のように感じます
チャーリー

回答:


169

open / readdirを気にせず、glob代わりに使用してください。

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

24
array_filter(..., 'is_file')質問はファイルを要求するので、そのグロブをラップすることをお勧めします。
サラテ2010年

23
すべてのファイル名の形式が異なるわけではありません。代わりに*.*使用*してください。
jameshfisher 2014

拡張子のリスト内のすべてのファイルを取得するにはどうすればよいですか?たとえば、すべての.phpファイルと.jsファイルが必要な場合はどうでしょうか。
nis 2014

3
ええ、この答えはあまり頑強ではありません。ファイルに拡張子を付ける必要はなく、ディレクトリに名前を付けることができますsomething.something。これは、使用することをお勧めしますarray_filterglob($log_directory.'/*')
アンドリュー

簡単な答えが必要だったので、これに賛成しました*.*。私のユースケースに関連するすべてのファイルはです。より堅牢な式は、これをさらに良い答えにします。
TecBrat 2017年

50

SPLスタイル:

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

チェックのDirectoryIteratorSplFileInfoを使用できる利用可能な方法のリストのためのクラスを。


パス全体ではなく、ファイルとその名前だけを取得するのに最適な方法です。ありがとうございます。
クリス

1
はい。フルパスについては、次を使用できますgetPathnamephp.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

受け入れられた回答には2つの重要な欠点があるため、正解を探している新規参入者のために改善された回答を投稿します。

foreach (array_filter(glob('/Path/To/*'), 'is_file') as $file)
{
    // Do something with $file
}
  1. globe関数の結果をでフィルタリングするis_file必要があります。これは、一部のディレクトリも返す可能性があるためです。
  2. すべてのファイルの.名前にが含まれているわけではないため*/*、一般的にパターンは最悪です。

これは私のために働いたクリーンな実行です。以前の回答は、私が望まなかった結果のディレクトリを示していました。
AWP

あなたはもっと賛成票が必要です!実際(Windowsでは)basename($file)ファイル名を含むパス全体ではなく、ファイル名のみを取得するために使用する必要がありました。
パウロコ

11

私はこれを行うためのより小さなコードを持っています:

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

「。」という名前の2つのガベージファイルを除くすべてのファイルを返します。および「..」。「。」という名前のファイルはありません。と私のディレクトリの「..」。
kamranbhatti585 2017

1
$ files = array_diff(scandir($ path)、array( '。'、 '..'));を使用します。私が議論した上記のエラーを解放するために。
kamranbhatti585 2017

いいね。ファイルの拡張子を削除するにはどうすればよいですか?(.php各ファイルを削除する必要があります。)
KSPR 2018

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.