directory iterator real time?
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?
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?
Code (php)
1
2
3
4
5
6
2
3
4
5
6
<?php
$iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($directory));
foreach ($iterator as $path) {
// doe iets met de paden
}
?>
$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?
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.
Ik zou het niet weten. Als de iterator lazy is opgebouwd (Ik denk echter dat de DirectoryIterator niet lazy is en het dus niet wordt geupdated.
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.
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.
Thanks voor de tip.
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 denk dat je de 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.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?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', '');
}
?>
$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:
Conclusie:
(Recursive)DirectoryIterator is niet real time.
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?
Ooit van PHP.net gehoord?
yup... ik werd er alleen niet veel wijzer van... en geen vragen stellen waar je het antwoord al op weet ;)
(vrij_ Vertaald: Biedt een interface om over RecursiveIterators te itereren
RecursiveTreeIterator - Allows iterating over a RecursiveIterator to generate an ASCII graphic tree.
(vrij) Vertaald: Maakt het mogelijk om over een RecursiveIterator te itereren om zo een ASCII boom afbeelding te maken
Kortom: De RecursiveTreeIterator heeft een specifiek doel, het maken van een ASCII tree (zie ook de method die ik aan roep in de foreach), de RecursiveIteratorIterator is de meest algemene recursieve IteratorIterator.
Zoals je ook kan zien is de RecursiveTreeIterator niks anders dan een extensie van de RecursiveIteratorIterator.
Thanks voor de uitleg Wouter, ik snap alleen niet wat er wordt bedoeld met een ASCII graphic tree. Wordt er dan een "tekening" gegenereerd? :-s Wat moet ik me er bij voorstellen?
En daarnaast eerste hit op google, die andere site die je wel moet kennen, (anscii graphic tree) resulteert in een andere ASCII tree: http://stackoverflow.com/questions/1581559/ascii-library-for-creating-pretty-directory-trees
Wel apart dat die iterator kan "tekenen". Of ik het ooit nodig heb, geen idee. Maar nu weet ik in ieder geval dat het kan.