Ola,

Ik zat me iets af te vragen... als je een directory iterator hebt die je toekent aan een variabele, is die iterator dan "real-time"? Dus stel je kent de iterator toe aan een variabele en een paar miliseconde later wordt er een nieuw bestand toegevoegd aan de directory. Is dat bestand dan gelijk een onderdeel van de iterator? Ik denk zelf eigenlijk van niet en dat de iterator gewoon 1 keer wordt ingelezen, maar zeker weten doe ik het niet. Weten jullie dit toevallig?
Dat hangt ervan af hoe je die iterator bouwt…

Bijvoorbeeld scandir() geeft je een array met een momentopname van een directory. Ga je die array daarna verwerken, dan kan er inderdaad een verschil ontstaan tussen de werkelijke directory-inhoud en de kopie daarvan in de array.

Kun je anders wat code laten zien?
Ik bedoel zeg maar zoiets als dit:

<?php
$iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($directory));
foreach ($iterator as $path) {
// doe iets met de paden
}
?>
Stel nu bijv. dat ik alle paden wil tonen, en terwijl de foreach loop wordt uitgevoerd, wordt er nog een file in de directory opgeslagen. Krijg ik die dan nog te zien?
Ik zou het niet weten. Als de iterator lazy is opgebouwd (meer info) dan is dat wel zo, behalve als ie voor het huidige bestand is.

Ik denk echter dat de DirectoryIterator niet lazy is en het dus niet wordt geupdated.
Excuus Wouter dat ik niet meer heb gereageerd. Ik heb (zover ik weet) geen mail ontvangen dat er iemand had gereageerd, dus ik zie je reactie nu voor het eerst.

Ik had gehoopt dat Ward na zijn opmerking "Dat hangt ervan af hoe je die iterator bouwt…" nog even zou reageren eigenlijk...

Iemand die zeker weet hoe de vork in de steel zit?? Ik hoor het graag.
Je zou het zelf kunnen testen hè:

1. Maak een nieuwe directory met subdirectory's.
2. Maak een new RecursiveDirectoryIterator voor dat pad.
3. Verwijder de directory.
4. Kijk wat de RecursiveDirectoryIterator doet.

Ik vermoed (en hoop) dat de RecursiveDirectoryIterator niet zomaar exclusieve toegang tot het pad heeft. Dat zou namelijk allerlei andere processen in de weg zitten waarbij bestanden en directory's moeten worden opgeslagen, verwijderd, hernoemd, gewijzigd en dergelijke binnen dat pad.
Ah zo ja, dat zou ik inderdaad kunnen proberen. Had ik zelf eigenlijk ook kunnen bedenken :-s

Thanks voor de tip.
Ik denk dat je de RecursiveDirectoryIterator het beste, zoals veel SPL-onderdelen, alleen kunt gebruiken als generiek prototype waarmee je zelf iets specifieks bouwt. Bij veel iteraties van een pad mag er ondertussen gerust wat veranderen, bij enkele andere soms juist per se niet. Vandaar dat ik eerder zei: hangt ervan af hoe je het zelf implementeert.
Ik gebruik het om een array te verkrijgen van een directory waarin alle subdirectories en bestanden staan. Is dat wat je bedoelt? Ik gebruik het bijvoorbeeld om een directory leeg te maken. Maar ik vroeg me dus af of als ik aan het leegmaken ben en er wordt ondertussen een bestand bij geplaatst, of dit bestand dan ook nog wordt verwijderd. Maar ik denk eigenlijk van niet, omdat het geen onderdeel is van de iterator/array.
Test:
<?php

$path = __DIR__.'/fixtures'; // base path

// remove all files in the dir
foreach (glob($path.'/*') as $f) unlink($f);

// add 3 files: file1, file2 and file3
for ($i = 0; ++$i < 4; file_put_contents($path.'/file'.$i, ''));

// create recursive directory iterator
$dirIterator = new \RecursiveDirectoryIterator($path);
// make a nice tree for me
$treeIterator = new \RecursiveTreeIterator($dirIterator);

// walk through the recursive directory iterator
foreach ($treeIterator as $dir) {
// echo the tree element
echo $treeIterator->getPrefix().substr($treeIterator->getEntry(), strlen($path) + 1).$treeIterator->getPostfix(), PHP_EOL;

// create a new file, is the directory lazy loaded?
file_put_contents($path.'/file'.uniqid().'.txt', '');
}
?>

Output:
|-file1
|-file2
\-file3


Conclusie:
(Recursive)DirectoryIterator is niet real time.
Dankjewel Wouter!

Wat is preces een RecursiveTreeIterator?

Als ik de inhoud van een dir wil hebben gebruik ik dit:

$iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($directory));

Wat is het verschil?

Reageren