[php] Recursive Directory Iterator method van parent

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • afraca
  • Registratie: April 2009
  • Laatst online: 13-08 16:46

afraca

Open Source!

Topicstarter
Het is alweer een tijd geleden dat ik wat met php aan het knutselen was, maar ik wilde even iets uitproberen. Ik wilde voor mijzelf even php een map recursief laten scannen en alle avi files listen. Dus ik knutselde dit in elkaar, easy peasy, bijzonder eenvoudig:

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
<?php

$allowed = array("avi","mkv",);

// $info->isDot() werkt dus niet
// aangezien RecursiveDirectoryIterator de method isDot -->inherits<--
// Hoe extern aan te spreken?

if($_SERVER['REQUEST_METHOD'] == "POST"){
    foreach(new RecursiveDirectoryIterator($_POST['path']) as $info){
        if(!$info->isDot() && in_array(substr($info->getFilename(),-3),$allowed)){
            echo $info->getFilename().'<br />';
        }
    }
}
else{
    echo 'Vul hier het volledige pad in naar de map die gescand moet worden: 
    <br /><form method="post" action="'.$_SERVER['PHP_SELF'].'">    
    <input type="text" name="path">
    <input type="submit" value="verzenden" name="verzonden"><input type="reset" value="herstel" name="reset">
    </form>';
}

?>


Nu is de grap als volgt. Ik had het eerst gewoon gedaan met normale DirectoryIterator, dat was geen probleem, voor 1 directory uiteraard. (Dus het probleem zit hem bijvoorbeeld niet in de foreach, al is dat wellicht wat bijzondere constructie, had ik van php.net voorbeeld overgenomen (zoals ik zei, "lang" geleden ;) ) ). Echter, als we dit scriptje uitvoeren krijgen we dit:

code:
1
Fatal error: Call to undefined method SplFileInfo::isDot() in xxx\dir.php on line 11


Dus dan kijk je al wat raar op, want isDot() werkte zonet nog wel.... Zie je op php.net dit:
...
/* Inherits */
.....
public bool DirectoryIterator::isDot ( void )
....
Geweldig, hij inherets dus hier, in plaats van bij normale directoryiterator dat hij 'm zelf heeft.... Hoe krijg ik het nou buiten de class om oor elkaar die method aan te roepen?

IMDB vote history | Next-gen OS, audio en video player, search engine en Movie DB


Acties:
  • 0 Henk 'm!

Verwijderd

Leuk bedacht, maar $info is niet je RecursiveDirectoryIterator.
Als je zelf allerlei trucs uithaalt met het overriden van o.a. de next en key methods, zal dit niet zomaar gaan werken.

Kortom, waar is je class definition?

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 21:24

.oisyn

Moderator Devschuur®

Demotivational Speaker

Verwijderd schreef op donderdag 08 april 2010 @ 18:16:
Leuk bedacht, maar $info is niet je RecursiveDirectoryIterator.
Volgens de docs wel. Of dat geldt iig voor DirectoryIterators zelf, daar is current een DirectoryIterator instance. En die zou dus een isDot() moeten implementeren. Echter, de error suggereert dat het een SplFileInfo instance is, wat volgens de specs dus niet klopt.
Kortom, waar is je class definition?
Op php.net. http://www.php.net/manual...sivedirectoryiterator.php

[ Voor 21% gewijzigd door .oisyn op 08-04-2010 18:35 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

Verwijderd

Ok, domme aanname dat de TS zelf een class had geschreven. My bad.

Acties:
  • 0 Henk 'm!

  • pderaaij
  • Registratie: Oktober 2005
  • Laatst online: 18-08 20:16
Je moet de RecursiveDirectoryIterator doorgeven aan een RecursiveIteratorIterator, zie: http://www.php.net/manual...oryiterator.construct.php.

Wellicht vindt je hier nog meer informatie: http://bugs.php.net/bug.php?id=44018

Acties:
  • 0 Henk 'm!

  • afraca
  • Registratie: April 2009
  • Laatst online: 13-08 16:46

afraca

Open Source!

Topicstarter
Dat had ik inderdaad nog even moeten vermelden, de link naar de manual. Desondanks dank voor het meedenken. Blijft het mysterie nog overeind ;)
.oisyn schreef op donderdag 08 april 2010 @ 18:31:
[...]
Echter, de error suggereert dat het een SplFileInfo instance is, wat volgens de specs dus niet klopt.
Dus de fout is dat het een SplFileInfo instance is? En hoe moet ik dat gaan oplossen?

EDIT:
@pderaaij: Ik zal er even naar kijken ;) M'n reply was beetje te laat.

[ Voor 8% gewijzigd door afraca op 08-04-2010 19:06 ]

IMDB vote history | Next-gen OS, audio en video player, search engine en Movie DB


Acties:
  • 0 Henk 'm!

  • Matis
  • Registratie: Januari 2007
  • Laatst online: 21:17

Matis

Rubber Rocket

RecursiveDirectoryIterator extends vanuit DirectoryIterator en derhalve heeft $info dus geen ::isDot() functionaliteit.

edit; eerst refreshen na het halen van koffie :P

[ Voor 17% gewijzigd door Matis op 08-04-2010 19:07 ]

If money talks then I'm a mime
If time is money then I'm out of time


Acties:
  • 0 Henk 'm!

  • hostname
  • Registratie: April 2009
  • Laatst online: 17-09 17:56
Die hele RecursiveIterator is sowieso nogal vaag. Als je een Recursive variant heb verwacht je toch dat die hetzelfde doet als een niet-recursief variant, alleen dan recursief, en niet dat je daar nog een iterator voor nodig hebt? SPL is ook nog niet echt goed gedocumenteerd. Die RecursiveDirectoryIterator is echter een iterator over directoryiterators... lekker design weer 8)7

Anyway, het probleem dat SplFileInfo geen isDot() heeft is redelijk makkelijk op te lossen met een oneliner:
PHP:
1
$isDot = substr($info->getFileName(), 0, 1) == '.'

Acties:
  • 0 Henk 'm!

  • afraca
  • Registratie: April 2009
  • Laatst online: 13-08 16:46

afraca

Open Source!

Topicstarter
Hmm, ik ben zéker geen ster in loops in combinatie met objects..... Ik zag in de comments op diverse php.net pagina's verschillende structuren, maar niet echt heel succesvol hier ^_^

Ik zal zo even kijken wat de "oplossing" van hostname hierboven doet. Ik ben het inderdaad met je eens dat het wel redelijk vaag in elkaar zit :/

IMDB vote history | Next-gen OS, audio en video player, search engine en Movie DB


Acties:
  • 0 Henk 'm!

  • Leftblank
  • Registratie: Juni 2004
  • Laatst online: 14:50
hostname schreef op donderdag 08 april 2010 @ 21:41:
Anyway, het probleem dat SplFileInfo geen isDot() heeft is redelijk makkelijk op te lossen met een oneliner:
PHP:
1
$isDot = substr($info->getFileName(), 0, 1) == '.'
Dat zou dan wel een foute implementatie zijn. Om de PHP.net docs te quoten:
code:
1
 TRUE if the entry is . or .., otherwise FALSE

Een file die begint met een . kan prima een file zijn en is dus geen dot. Denk bijv aan hidden files op unix welke met een punt beginnen.

Overigens kudos voor diegene die heeft verzonnen dat je een RecursiveIteratorIterator klasse hebt, prachtige naamgeving. :o

[ Voor 4% gewijzigd door Leftblank op 08-04-2010 21:54 ]


Acties:
  • 0 Henk 'm!

  • hostname
  • Registratie: April 2009
  • Laatst online: 17-09 17:56
Leftblank schreef op donderdag 08 april 2010 @ 21:54:
[...]

Dat zou dan wel een foute implementatie zijn. Om de PHP.net docs te quoten:
code:
1
 TRUE if the entry is . or .., otherwise FALSE

Een file die begint met een . kan prima een file zijn en is dus geen dot. Denk bijv aan hidden files op unix welke met een punt beginnen.
Oh, ik dacht dat hij alle files die met een punt begonnen tegen zou houden. Dit is ook makkelijk:
PHP:
1
2
3
!$item->isDot()
// vervangen door
($item->getFilename() != "." && $item->getFilename() != "..")
Leftblank schreef op donderdag 08 april 2010 @ 21:54:
Overigens kudos voor diegene die heeft verzonnen dat je een RecursiveIteratorIterator klasse hebt, prachtige naamgeving. :o
ja inderdaad _/-\o_

[ Voor 0% gewijzigd door hostname op 08-04-2010 22:24 . Reden: php code tag ]


Acties:
  • 0 Henk 'm!

  • afraca
  • Registratie: April 2009
  • Laatst online: 13-08 16:46

afraca

Open Source!

Topicstarter
Die hele Iterator classes zijn een beetje te vreemd voor mij. Heb nu met behulp van de comments daar (php.net) wat leuks in elkaar kunnen knutselen dat prima voldoet:

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
25
26
27
28
29
<?php 
error_reporting(E_ALL | E_STRICT);
ini_set('display_errors',1);

$allowed = array("avi","mkv",); 

if($_SERVER['REQUEST_METHOD'] == "POST"){ 
    $fileSPLObjects = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($_POST['path']),RecursiveIteratorIterator::SELF_FIRST);
    try {
        foreach( $fileSPLObjects as $fullFileName => $fileSPLObject ) {
            if(in_array(substr($fileSPLObject->getFilename(),-3),$allowed)){
                echo $fileSPLObject->getFilename() . "<br />";  
            }
        }
    }
    catch (UnexpectedValueException $e) {
        printf("Directory [%s] contained a directory we can not recurse into", $directory);
    }
   
} 
else{ 
    echo 'Fill in the path to be scanned:  
    <br /><form method="post" action="'.$_SERVER['PHP_SELF'].'">     
    <input type="text" name="path"> 
    <input type="submit" value="send" name="sent"><input type="reset" value="herstel" name="reset"> 
    </form>'; 
} 

?>


edit:
Omdat filteren op extensie nou niet ideaal is, je sluit dingen onbedoeld uit en dergelijke, heb ik maar gebruik gemaakt van getSize in plaats van getFilename.

[ Voor 6% gewijzigd door afraca op 08-04-2010 23:10 ]

IMDB vote history | Next-gen OS, audio en video player, search engine en Movie DB

Pagina: 1