Toon posts:

[php] Bestanden in map tellen

Pagina: 1
Acties:

Onderwerpen


  • scartsjer
  • Registratie: februari 2007
  • Laatst online: 28-03-2018
ik ben bezig met een soort foto album script voor mijn portfolio,

nu stuit ik op een probleem.

op mijn offline test webserver werkt de volgende regel wel:
PHP:
1
2
$dir = "./".$folder."/mini/*"; 
$count = count(glob("$dir"));


echter heeft mijn webhosting een ouder type php op hun server staan hierdoor werkt de count(glob()) niet....

nu probeer ik het aantal bestanden te tellen op een andere manier:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
$dir= "./".$folder."/mini/";
function countFiles($dir){  
    $files = array();  
    $directory = opendir($dir);  
    while($item = readdir($directory)){  
    // We filter the elements that we don't want to appear ".", ".." and ".svn"  
         if(($item != ".") && ($item != "..") && ($item != ".svn") ){  
              $files[] = $item;  
         }  
    }  
    $numFiles = count($files);  
    print $numFiles;  
}


echter dit leverd zowel op de offline test server als de webhosting geen resultaten op... wat gaat hier mis??

alvast erg bedankt voor reactie's

  • Morax
  • Registratie: mei 2002
  • Laatst online: 24-09 20:34
Weet je zeker dat je de goeie map opent? En heb je wel rechten om die map uit te lezen?

readdir() geeft een FALSE terug wanneer hij de map niet kan openen, waardoor je while-loop in dat geval totaal niet uitgevoerd zal worden :)

Edit:
Als je alleen files wilt tellen, en geen mappen, is het misschien handig ook een is_file() check te doen voor elk $item?

[Voor 29% gewijzigd door Morax op 19-10-2010 20:47]

What do you mean I have no life? I am a gamer, I got millions!


  • kaesve
  • Registratie: maart 2009
  • Laatst online: 11:01
volgens mij is dit een geval van het wiel opnieuw uitvinden. misschien werkt dit:

PHP:
1
$count = count(scandir($dir));

  • mithras
  • Registratie: maart 2003
  • Niet online
Maak je eigen DirectoryIterator die ook Countable implementeert:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
class MyDirectoryIterator extends DirectoryIterator implements Countable
{
  private $_count = 0;

  public function __construct($path)
  {
    parent::__construct($path);
    foreach($this as $file)
      if($file->isFile())
        $this->_count++;
  }

  public function count()
  {
    return $this->_count;
  }
?>
Dan is het eenvoudig:

PHP:
1
2
$dir = new DirectoryIterator($path);
count($dir);
:)

[Voor 12% gewijzigd door mithras op 19-10-2010 20:52]


  • scartsjer
  • Registratie: februari 2007
  • Laatst online: 28-03-2018
kaesve schreef op dinsdag 19 oktober 2010 @ 20:48:
volgens mij is dit een geval van het wiel opnieuw uitvinden. misschien werkt dit:

PHP:
1
$count = count(scandir($dir));
fuuuu dat ik daar niet eerder aan had gedacht.
enig nadeel tenopzichte van de glob functie is dat de scandir hoe dan ook 2 extra bestanden mee telt ...? maargoed dat is snel opgelost.

ik heb nu het volgende gedaan:
PHP:
1
2
3
4
                $dir = "./".$folder."/mini/";
                $count = count(scandir("$dir"));
                $count = $count - 2;
                if ($count > '0') {


TNX !!!

[Voor 4% gewijzigd door scartsjer op 19-10-2010 21:04]


  • robbert
  • Registratie: april 2002
  • Laatst online: 09:51
scartsjer schreef op dinsdag 19 oktober 2010 @ 21:00:
enig nadeel tenopzichte van de glob functie is dat de scandir hoe dan ook 2 extra bestanden mee telt ...? maargoed dat is snel opgelost.
glob telt hidden files niet mee, jij nu wel. Het volgende is mooier en duidelijker IMHO.
PHP:
1
2
3
4
$count = count(array_filter(
  scandir($dir), 
  create_function('$f', 'return substr($f, 0, 1) != ".";')
));

Of het volgende indien je directories ook niet mee wil tellen:
PHP:
1
2
3
4
$count = count(array_filter(
  scandir($dir), 
  create_function('$f', 'return is_file($f) && substr($f, 0, 1) != ".";')
));
Je vergelijkt hier een int met een string...
Desondanks gaat dit wel goed in PHP gezien '0' naar 0 gecast wordt. Maar dit soort dingen zijn natuurlijk erg onsmakelijk.

[Voor 52% gewijzigd door robbert op 19-10-2010 21:12]


  • scartsjer
  • Registratie: februari 2007
  • Laatst online: 28-03-2018
robbert schreef op dinsdag 19 oktober 2010 @ 21:05:
[...]

glob telt hidden files niet mee, jij nu wel. Het volgende is mooier en duidelijker IMHO.
PHP:
1
2
3
4
$count = count(array_filter(
  scandir($dir), 
  create_function('$f', 'return substr($f, 0, 1) != ".";')
));

Of het volgende indien je directories ook niet mee wil tellen:
PHP:
1
2
3
4
$count = count(array_filter(
  scandir($dir), 
  create_function('$f', 'return is_file($f) && substr($f, 0, 1) != ".";')
));


[...]

Je vergelijkt hier een int met een string...
Desondanks gaat dit wel goed in PHP gezien '0' naar 0 gecast wordt. Maar dit soort dingen zijn natuurlijk erg onsmakelijk.
Dank je dit is inderdaad de nettere manier.

echter de code die ook de mappen niet mee moet tellen functioneert niet. lijkt er op dat mijn servers de is_file() functie niet leuk vinden ... heb ik al vaker last van gehad...

Het nadeel van snel willen programmeren als je het al een lange tijd niet hebt gedaan is dat er inderdaad schoonheid's foutjes in komen te zitten, heb het aangepast.

  • mithras
  • Registratie: maart 2003
  • Niet online
Als je het nu gewoon doet volgens mijn voorstel kan je zelf eenvoudig de mappen, bestanden, beide of het totaal (inclusief . en .. dus) meenemen.

De iterator geeft je namelijk allemaal SplFileInfo objecten terug waar je SplFileInfo::isDir(), SplFileInfo::isFile() en SplFileInfo::isDot() mee kan opvragen. Want create_function gebruiken om bestanden in een map te tellen, dat ziet er in mijn ogen niet als "de beste" manier uit ;)

  • CodeCaster
  • Registratie: juni 2003
  • Niet online

CodeCaster

👌👀 good shit ✔💯

scartsjer schreef op dinsdag 19 oktober 2010 @ 21:00:
PHP:
1
2
                $count = count(scandir("$dir"));
                if ($count > '0') {
Doe eens niet zo raar met je variabelen en literals.
robbert schreef op dinsdag 19 oktober 2010 @ 21:05:
Of het volgende indien je directories ook niet mee wil tellen:
PHP:
1
2
3
4
$count = count(array_filter(
  scandir($dir), 
  create_function('$f', 'return is_file($f) && substr($f, 0, 1) != ".";')
));
Een bestandsnaam kan ook gewoon met een punt beginnen.

[Voor 41% gewijzigd door CodeCaster op 20-10-2010 09:46]

As always, we are nailed to a cross of our own construction.


  • TJHeuvel
  • Registratie: mei 2008
  • Niet online
mithras schreef op woensdag 20 oktober 2010 @ 09:08:
Als je het nu gewoon doet volgens mijn voorstel kan je zelf eenvoudig de mappen, bestanden, beide of het totaal (inclusief . en .. dus) meenemen.
Voor een beginner is een full-fledged OO implementatie toch net iets te hoog gegrepen denk je niet?
scartsjer schreef op dinsdag 19 oktober 2010 @ 21:00:
enig nadeel tenopzichte van de glob functie is dat de scandir hoe dan ook 2 extra bestanden mee telt ...? maargoed dat is snel opgelost.
Je kan door te debuggen begrijpen waarom hij dit doet. Als je de lijst met bestanden laat zien zul je merken dat daar ook . en .. tussen staan. Dit zijn de parent-folder en root, deze wil je inderdaad niet meetellen.

Freelance Unity3D developer


  • Matis
  • Registratie: januari 2007
  • Laatst online: 13:19

Matis

Rubber Rocket

Ik gebruik zelf altijd de array_diff om eventuele ongewenste bestanden en mappen te verwijderen uit de directory-index.
PHP:
1
2
3
4
5
6
<?php
$target = '/';
$weeds = array('.', '..');
$dirContent = array_diff(scandir($target), $weeds);
$dirCount = count($dirContent );
?>


Let wel, scandir telt ook de mappen mee die in de map zitten. Je zou eventueel met is_file() en een loopje kunnen kijken of het een bestand is of een map.

[Voor 3% gewijzigd door Matis op 20-10-2010 14:24]

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


  • dev10
  • Registratie: april 2005
  • Laatst online: 24-09 15:24
CyCloneNL schreef op woensdag 20 oktober 2010 @ 09:43:
[...]

Voor een beginner is een full-fledged OO implementatie toch net iets te hoog gegrepen denk je niet?
Plus dat het waarschijnlijk niet werkt bij de TS, omdat hij aangeeft dat de webhoster over een oudere PHP versie beschikt. Glob werkt vanaf PHP => 4.3.0 en de OO implementatie vanaf 5.1.0.

  • Cartman!
  • Registratie: april 2000
  • Niet online
Dan is het de TS zijn eigen schuld dat hij een host kiest met oude versie. Een webhoster die geen 5.2.6+ aanbiedt mag zich schamen imo.

  • mithras
  • Registratie: maart 2003
  • Niet online
CyCloneNL schreef op woensdag 20 oktober 2010 @ 09:43:
[...]

Voor een beginner is een full-fledged OO implementatie toch net iets te hoog gegrepen denk je niet?
Ja, en daarvoor in de plaats oplossingen aandragen die 1) niet compleet zijn (bestanden kunnen prima met . beginnen) en 2) meer voor spagetticode zorgen dan het overzichtelijk een probleem oplost :?
dev10 schreef op woensdag 20 oktober 2010 @ 14:28:
[...]
Plus dat het waarschijnlijk niet werkt bij de TS, omdat hij aangeeft dat de webhoster over een oudere PHP versie beschikt. Glob werkt vanaf PHP => 4.3.0 en de OO implementatie vanaf 5.1.0.
True. Het is misschien wel meer de vraag of je wel bij een hoster wil blijven dat een pakket uit 2002 gebruikt. De laatste php stable (5.3.3) komt uit juli 2010 en 5.1/5.2 is al enorm ingeburgerd. Ga je ook desktop applicaties ontwikkelen op een Windows '95 machine?
Cartman! schreef op woensdag 20 oktober 2010 @ 15:01:
Dan is het de TS zijn eigen schuld dat hij een host kiest met oude versie. Een webhoster die geen 5.2.6+ aanbiedt mag zich schamen imo.
QFT

  • dev10
  • Registratie: april 2005
  • Laatst online: 24-09 15:24
mithras schreef op woensdag 20 oktober 2010 @ 15:26:
True. Het is misschien wel meer de vraag of je wel bij een hoster wil blijven dat een pakket uit 2002 gebruikt. De laatste php stable (5.3.3) komt uit juli 2010 en 5.1/5.2 is al enorm ingeburgerd. Ga je ook desktop applicaties ontwikkelen op een Windows '95 machine?
In ontwikkel geen desktopapplicaties. :+

Maar inderdaad, je hebt wel gelijk. ;)

  • TJHeuvel
  • Registratie: mei 2008
  • Niet online
mithras schreef op woensdag 20 oktober 2010 @ 15:26:
[...]
Ja, en daarvoor in de plaats oplossingen aandragen die 1) niet compleet zijn (bestanden kunnen prima met . beginnen) en 2) meer voor spagetticode zorgen dan het overzichtelijk een probleem oplost :?
Dus in jouw eerste Hello World applicatie zat al lokalisatie, zonder gehardcode strings?

Ik probeer alleen te zeggen dat je het rustig aan moet beginnen, en niet direct met zulk soort concepten moet aankomen bij beginners. Uiteraard als je een professioneel webdeveloper bent wil je al je code goed opzetten, en alle cases kunnen coveren. Voor zulk soort mensen is het ook geen probleem om jouw aanpak te gebruiken, wat misschien wel de juiste is.

Maar voor een beginner, welke net zijn eerste eigen site maakt is het niet zo onwijs erg dat het wat rommelig wordt, of niet met een paar cases om kan gaan. Zo kan hij zelf tegen deze problemen aanlopen er er wat van leren.

[Voor 3% gewijzigd door TJHeuvel op 20-10-2010 15:54]

Freelance Unity3D developer


  • robbert
  • Registratie: april 2002
  • Laatst online: 09:51
CodeCaster schreef op woensdag 20 oktober 2010 @ 09:29:
Een bestandsnaam kan ook gewoon met een punt beginnen.
Dat snap ik. Echter, bestanden waarvan de bestandsnaam met een punt begint zijn hidden (althans, in UNIX). Gezien de TS oorspronkelijk glob wilde gebruiken, nam ik aan dat die hidden bestanden niet mee wil tellen (gezien glob die ook niet meeneemt).

[Voor 4% gewijzigd door robbert op 20-10-2010 18:34]


  • Gratzip
  • Registratie: oktober 2010
  • Laatst online: 26-09-2020
Je code werkte in het begin niet omdat je er een functie van had gemaakt:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
$dir= "./".$folder."/mini/";
function countFiles($dir){  
    $files = array();  
    $directory = opendir($dir);  
    while($item = readdir($directory)){  
    // We filter the elements that we don't want to appear ".", ".." and ".svn"  
         if(($item != ".") && ($item != "..") && ($item != ".svn") ){  
              $files[] = $item;  
         }  
    }  
    $numFiles = count($files);  
    print $numFiles;  
}
Moest dit zijn:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
function countFiles($dir){  
    $files = array();  
    $directory = opendir($dir);  
    while($item = readdir($directory)){  
    // We filter the elements that we don't want to appear ".", ".." and ".svn"  
         if(($item != ".") && ($item != "..") && ($item != ".svn") ){  
              $files[] = $item;  
         }  
    }  
    $numFiles = count($files);  
    print $numFiles;  
}
$dir= "./".$folder."/mini/";
countFiles($dir);
?>

^ dat de functie ook wordt uitgevoerd op het eind.

  • T020
  • Registratie: juli 2007
  • Laatst online: 18-07 01:58
om antwoord te geven op je vraag: "wat gaat hier mis?"
Misschien zou dit het kunnen zijn.
op http://nl.php.net/readdir staat een warning:
This function may return Boolean FALSE, but may also return a non-Boolean value which evaluates to FALSE, such as 0 or "". Please read the section on Booleans for more information. Use the === operator for testing the return value of this function.

je moet dus binnen je while-conditie dit zetten:
PHP:
1
while( false !== ($item = readdir($directory)) ) ...

zo voorkom je dat bestanden onterecht worden overgeslagen (dit staat btw ook in de examples bij de PHP manual)

En het is ook wel netjes om na de while-loop even dit neer te zetten:
PHP:
1
closedir($dir);

zo heb je geen onnodige open directory handles
Pagina: 1


Nintendo Switch (OLED model) Apple iPhone 13 LG G1 Google Pixel 6 Call of Duty: Vanguard Samsung Galaxy S21 5G Apple iPad Pro (2021) 11" Wi-Fi, 8GB ram Nintendo Switch Lite

Tweakers vormt samen met Hardware Info, AutoTrack, Gaspedaal.nl, Nationale Vacaturebank, Intermediair en Independer DPG Online Services B.V.
Alle rechten voorbehouden © 1998 - 2021 Hosting door True

Tweakers maakt gebruik van cookies

Bij het bezoeken van het forum plaatst Tweakers alleen functionele en analytische cookies voor optimalisatie en analyse om de website-ervaring te verbeteren. Op het forum worden geen trackingcookies geplaatst. Voor het bekijken van video's en grafieken van derden vragen we je toestemming, we gebruiken daarvoor externe tooling die mogelijk cookies kunnen plaatsen.

Meer informatie vind je in ons cookiebeleid.

Sluiten

Forum cookie-instellingen

Bekijk de onderstaande instellingen en maak je keuze. Meer informatie vind je in ons cookiebeleid.

Functionele en analytische cookies

Deze cookies helpen de website zijn functies uit te voeren en zijn verplicht. Meer details

janee

    Cookies van derden

    Deze cookies kunnen geplaatst worden door derde partijen via ingesloten content en om de gebruikerservaring van de website te verbeteren. Meer details

    janee