PHP Könyvtárak tartalmának lekérdezése

Sziasztok!

Van egy windows XP pro sp3 XAMPP szerver és szintén van ugyenezen a gépen agy easy-php 5.3.0

A böngésző lehal ennek a függvénynek a futtatásánál (tölt-tölt-tölt, felzabálja a memóriát és lefagy):


	function uresKonyvtar($kvt_nev)
	{
		$i = 0;
		$kvt = opendir($kvt_nev);
		
		while( ($fajl = readdir( $kvt ) ) !== false )
		{
			if(($fajl != ".") && ($fajl != ".."))
				$i++;
		}
		
		if($i!=0)
		{
			return false;
		}
		else
		{
			return true;
		}
	}

De nem mindig hal meg, mert tegnap este ment rendesen :) Nem értem mi lehet a gond.
Ezt a XAMPP-on és az EasyPHP-n is csinálta, de az otthoni szintén EasyPHP 5.3.0 szerveremen meg megy minden rendesen (XP Home SP2)

Könyvtárjogosultsági gond nem lehet, mert hol működik, hol nem.
Mindig meghagyom a szkriptjeim korábbi verzióit is és érdekes módon, amikor egy újonnan feltöltött könyvtárlekérdező szkriptet futtatok (még ha 1 bájtot sem változott a régi verzióhoz képest), akkor ez a probléma jelentkezik, de a már korábban fennlévő szkript meg lefut rendesen.

Láttatot már ilyet?
Vagy van más, erőforrástakarékosabb módszer arra, hogy megállapítsuk, hogy egy könyvtár üres-e? Könyvtár lekérdező függvényt nem találtam a PHP dokumentációjában, de találtam a neten egy az enyémhez hasonló függvényt, mely megszámolja a fájlokat és lekéri azoknak a méreteit, de akkor meg ugyanott tartok, mert nagyon sok könyvtárnak a méreteit kell lekérdeznek egyszerre.

Mi lehet a baj?

Köszi.
MysteryKe.

Hozzászólások

Aztarohadt... ez a kódrészlet nagyon fáj.

public static function isEmptyDir($dir){
  return (($files = @scandir($dir)) && count($files) <= 2);
}

mi a baj vele? a logikája szerintem rendben van :)

Először is. Neve szerint és visszatérési értéke szerint ez a függvény ara lett kitalálva, hogy megmondja, hogy a könyvtár üres-e. Ennek ellenére elkezded számolni a fájlokat. Hogy minek, azt a jóég tudja, mert sehol nem használod fel. Ergo, az első $i++ helyett már ki is lehetne lépni false-val. De nem, megszámoljuk, aztán még kanyarítunk egy ilyet:
if ($i == 1) return 1;
if ($i == 2) return 2;
if ($i == 3) return 3;
if ($i == 4) return 4;
if ($i == 5) return 5;
...
Ugye érzed a fájdalmat?


function is_empty_dir($path)
{
    $dir = opendir($path);

    while(($f = readdir($dir) ) !== false )
    {
      if(($f != ".") && ($f != ".."))
        return false;
    }

    return true;
}

--
NetBSD - Simplicity is prerequisite for reliability

Nyilván lehet hanyagul a rendszerre bízni ezeket (és most rugaszkodjunk el a konrét és egyszerű példátol), de nem biztos, hogy kifizetődő. Szerintem jobb megszokni egy mindenhol érvényes módszert, és ezért tettem megjegyzést a kódhoz. Akinek el kell magyarázni/meg kell mutatni hogyan kell eldönteni, hogy egy dir üres-e vagy sem, annak mutassunk jópéldát azzal, hogy bezárjuk a megnyitott erőforrást.

java'nother blog

+1
Nagyon hasonlot akartam en is reagalni, csak nem volt ra idom. Nagyon le tudom tojni azt, hogy a PHP/Perl/Ruby/akarmi mikor es hogy zarja be, ha en ilyen kodot kapok, visszadobom, mert ez hanyag kodolas. Aki ilyent megenged maganak, annak a kodjait mindig at kell nezni.
--


()=() Ki oda vagyik,
('Y') hol szall a galamb
C . C elszalasztja a
()_() kincset itt alant.

Latszik, hogy te meg nem dolgoztal olyan cuccal, aminel nincs automatikus close, kulonben megszoktad volna, hogy mindig mindent le kell zarni. Peldaul:


10 OPEN 2,8,2,"TESTFILE,SEQ,WRITE"
20 PRINT#2,"TEST STRING"
30 END

Eredmeny: folyamatosan zolden vilagito disk drive, ha megpiszkalod (peldaul kiveszed a disket) akkor ervenytelen fajl lesz a vege, es nem garantalt, hogy az adat kiment a diskre (sot, altalaban nem is megy ki). Na, en itt szoktam meg, hogy az open mindig magaval vonzza a close szuksegesseget.

Es pedig ez is csak egy pelda kod volt, meg azt sem ellenorzom benne, hogy a fajl nem letezik-e esetleg mar.
--


()=() Ki oda vagyik,
('Y') hol szall a galamb
C . C elszalasztja a
()_() kincset itt alant.

Látszik, hogy te mindig mindent jobban tudsz másokrol, mint ő maguk. Jobban ismersz engem, mint én magamat, így most már tudom, hogy nem szabad lezárnom a nyitott descriptorokat, hisz hrgy84 megmondta. A példakódot sem én írtam, én csak megvédtem, hogy ez egy példakód. De nyugodtan kapálózz tovább, és hozz fel még pár folosleges érvet az igazad mellett. Mert igazad van, sehol nem írtam, hogy nem, csak még mindig fölöslegesek ezek a bizonyítgatások.

Felreertettel, illetve felreertettuk egymast. Eloszor is, en nagyon keves ervet tudok elfogadni a hanyagsag mellettt, marpedig a nyitott descriptorok le nem zarasa mindenkeppen hanyagsag, ebben valoszinuleg egyetertunk.
Masodszor, en vagyok olyan ordas nagy marha, hogy mindig magambol indulok ki. En nem engedem meg magamnak, hogy egy pelda kod elfogadhato ok nelkul ilyen banalis hibatol szenvedjen (gyakorlatilag tenyleg egy sor kerdese, nem faradsag odairni, hogy closedir($fh);). Lehet, hogy masnak nem ilyen az attitudje sajat magaval kapcsolatban, nekem ilyen. Igyekszem sokat elvarni magamtol, mert masok is sokat varnak el tolem.
Harmadreszrol pedig abban viszont neked van igazad, hogy tulreagaltam a dolgot. Sajnalom.
--


()=() Ki oda vagyik,
('Y') hol szall a galamb
C . C elszalasztja a
()_() kincset itt alant.

Ez nem hanyagság, hanem éppen hogy megkímél a felesleges kódsoroktól. Ha tudjuk, hogyan működik egy rendszer, akkor azt úgy kell programozni, ahogy elvárja és ahogy megengedhető. Ha tudjuk, hogy lezárja a megfelelő időben, akkor jó programozók vagyunk, mert többlettudásunk van és azt alkalmazzuk is. Ha meg mechanikusan csináljuk, a te jógyerek-robot elvárásod szerint, az szörnyű.

Igazad van, es nincs. Igazad van, mert valoban, van az embernek egy tobbletttudasa. Es nincs, mert a programozasi standardokat nem azert hasznaljak emberek, mert hulyeseg. Ennyi erovel sose szabaditsuk fel a memoriat, mert ha a program kilep, ugyis felszabadul, nem? Meg egyaltalan, szarjunk az egesz kodbiztonsagra, hiszen a rendszer ugyis gondolkodik helyettunk, mi koncentraljunk csak a feladatra, nem vagyunk mi jogyerek-robotok! Pfffff...
--


()=() Ki oda vagyik,
('Y') hol szall a galamb
C . C elszalasztja a
()_() kincset itt alant.

amugy a rendszer gyorsabban szabaditja fel a memoriat, szoval olvastam mar pedzegetest, hogy a kod futasanak a vegen neha elonyosebb nem egyesevel az alkalmazasbol felszabaditani a memoriat, hanem rabizni az OS-re, o egybe ki tudja kukazni a teljes az alkalmazas altal foglalt memoriat.

Tyrael

Mi garantálja azt, hogy ez a következő verzióban is így fog működni? Bár nem valószínű, de láttam már karón varjút. Ha azt gondoljuk, hogy, majd a program lezárja mert így működik, akkor megfeleltkezünk a "most még" kifejezésről, és bár lehet fáradságos lezárni kézzel, mégis nagyobb százalékos esélyünk van arra, hogy az a következő frissítéskor is lezáródik.

java'nother blog