
ディレクトリ内のファイルの一覧をPHPで取得しようと思っています。
glob関数を用い処理しようとしたところ、Windows環境で取得するファイルが重複している場合があります。
- ファイルが大量にある場合に発生します(数万個)
- Windowsのphpの場合に発生します(linuxでは発生しません)
- globで取得した場合も、scandir、opendirとreaddir、DirectoryIteratorなどを使った場合でも同じように発生します。
以下のプログラムでは、testディレクトリ内に10個ファイルが作成されるので、
当然「10」が出力されますが、100000個作成した場合などに「100001」などとなります。
配列内を見てみると例えば「68979.txt」が2つあったりします。
どのようなことが原因で考えられますでしょうか?
PHP
1<?php 2 3$dir="test/"; 4for ($i=1;$i<=10;$i++){ 5 file_put_contents($dir.$i.".txt",$i); 6} 7$files=glob($dir."*"); 8echo count($files); 9 10?>
。
補足情報
OS:Windows10 Pro,Home
PHP version:PHP 7.2.26 (cli)、PHP7.4.9 (cli)
追記
みなさま、回答コメントありがとうございます。
とりあえず自分の環境でだけ起こっているのではない、ということが確認でき安心しました。
別OS,別バージョン,別ファイルシステムについては、試す環境と時間がないので申し訳ありませんが、追加の情報はありません。
何個目のファイルから、どのファイルが重複してカウントされるかを確認するために、ファイル名の数字の桁を10桁にそろえて確認しました。
PHP
1<?php 2 3$max=65535*2; 4 5$dir='test/'; 6for ($i=1;$i<=$max;$i++){ 7 file_put_contents($dir.sprintf("%010d",$i).".txt",$i); 8} 9 10$files=glob($dir."*"); 11echo count($files); 12 13?> 14
65533ファイルまでは問題なく動作し、65534ファイルになるとglobで取得する値が65535個となり、0000065534.txtを2回取得しています。
その次は、131069(≒65535×2)ファイルで、同様に重複する値を取得します。
これ以上は検証していませんが、多分、65535ファイル毎に重複する
ファイルが1つずつ増えていく感じでしょうか。
現時点で確認している不具合はファイルの一覧を取得した際、存在しているファイルを重複して取得するだけなので、m6uさんのarray_unique()で対処可能です。
ただ、重複するのではなく、例えば取りこぼす(ファイルが存在するのに取得しない)ような不具合が仮にあったとすれば、array_unique()では対処できないので、別の方法を考える必要がありそうです。

















回答2件
あなたの回答
tips
プレビュー