データベースに移動する必要のある130万個のファイルを含むディレクトリがあります。ディレクトリ全体をスキャンせずに、ディレクトリから1つのファイル名を取得する必要があります。使い終わったら削除して次のファイルに移動するので、どのファイルを取得してもかまいません。これは可能ですか?私が見つけることができるすべての例は、ディレクトリリスト全体をスキャンして配列にしたようです。処理するために一度に1つだけ取得する必要があります...毎回130万ではありません。
4 に答える
This should do it:
<?php
$h = opendir('./'); //Open the current directory
while (false !== ($entry = readdir($h))) {
if($entry != '.' && $entry != '..') { //Skips over . and ..
echo $entry; //Do whatever you need to do with the file
break; //Exit the loop so no more files are read
}
}
?>
Returns the name of the next entry in the directory. The entries are returned in the order in which they are stored by the filesystem.
ディレクトリイテレータを取得して、ファイルである最初のエントリを探すだけです。
foreach(new DirectoryIterator('.') as $file)
{
if ($file->isFile()) {
echo $file, "\n";
break;
}
}
これにより、コードが予想以外のファイルシステムの動作で実行されるようになります。
DirectoryIterator
およびを参照してくださいSplFileInfo
。
readdirがそのトリックを行います。そのページの例を確認してください。ただし、ループでreaddir呼び出しを実行する代わりに、1回だけ実行してください。ディレクトリの最初のファイルを取得します。
注:サーバーによっては、「。」、「..」などの応答が返される場合があるため、有効なファイルが得られるまで、少なくともループする必要があります。
最初のディレクトリまたは最初のファイルを返しますか?両方とも?これを使って:
2つの引数(アドレスとモードのディレクトリまたはファイル?)を使用して関数「pickfirst」を作成します。
function pickfirst($address,$file) { // $file=false >> pick first dir , $file=true >> pick first file
$h = opendir($address);
while (false !== ($entry = readdir($h))) {
if($entry != '.' && $entry != '..' && ( ($file==false && !is_file($address.$entry)) || ($file==true && is_file($address.$entry)) ) )
{ return $entry; break; }
} // end while
} // end function
アドレスの最初のディレクトリを選択する$file
場合はfalseに設定し、アドレスの最初のファイルを選択する場合は$file
trueに設定します。
幸運を :)