Adresářový strom s počty souborů – PHP – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Adresářový strom s počty souborů – PHP – Fórum – Programujte.comAdresářový strom s počty souborů – PHP – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené — příspěvek s řešením.
VelkyBubak0
Newbie
3. 1. 2016   #1
-
0
-

Jak nejlépe mohu v php vypsat adresářový strom (samožřejmě za předpokladu že disponuji potřebnými právy)?

Nejde mi teď přímo o řešení ale spíše o postup:

  • pomocí opendir otevřu adresář, pomocí readdir načítám obsah a pomocí is_dir a is_file kontroluji co to je
  • co jsem zkoušel, asi je třeba projít adresář, zjistit počet souborů a názvy adresářů (a ty někam uložit) a pak začít procházet ty nalezené adresáře, zřejmě shodným způsobem jako ten kořenový, s tím že budu načítat cestu asi z pole
  • nenapadá mě jakým stylem ukládat nalezené informace, aby v tom nebyl brzo bordel a dalo se stím rozumně pracovat a až script doběhne i vypsat

Nahlásit jako SPAM
IP: 94.113.138.–
Kit+15
Guru
3. 1. 2016   #2
-
0
-

#1 VelkyBubak
Nalezené adresáře si prostě uložíš na konec seznamu, resp. fronty. Pokud jsi na konci adresáře, vezmeš si další položku z toho seznamu (fronty), dokud nejsi na konci.

Druhou metodou je traverzování, tzn. pokud najdeš podadresář, tak ho projdeš ihned. Když skončíš, tak pokračuješ tam, kde jsi přestal. Tato metoda je o něco jednodušší, protože nepotřebuješ žádnou datovou strukturu na skladování adresářů.

Volba mezi těmito metodami závisí na tom, v jaké podobě chceš ten strom prezentovat. Pokud jako strom, tak bude vhodnější ta druhá metoda - podadresář zpracovat hned, jakmile na něj narazíš.

Radím ti, aby sis dobře rozmyslel, zda chceš naráz celý strom. Zejména pokud je rozsáhlý. Obvykle totiž stačí jen aktuální adresář a ostatní rozbalovat ajaxem až na kliknutí.

Doplňující otázka: K čemu potřebuješ počet souborů? Snad ne kvůli nějakému cyklu?

Nahlásit jako SPAM
IP: 194.228.13.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
VelkyBubak0
Newbie
3. 1. 2016   #3
-
0
-

#2 Kit
ad doplňující otázka: Potřebuji zjistit kolik mám na serveru souborů, kde je jich nejvíce (a to obzvlášť pokud jich je někde přes 10.000 v jedné složce - protože to je limit, který se zobrazí přes ftp, pomocí něhož se bude obsah přesouvat na jiné VPS) a mám přístup jen k php/mysql/ftp.

Osobně se mi zdá lepší první možnost - traverzování, pokud to dobře chápu také znamená, že ve chvíli kdy narazím na nějaký adresář musím někam uložit mezivýsledek aktuálního a začít počítat soubory v novém od nuly, navíc bych řekl že by v tom byl asi dost velký zmatek, pokud má podadresář více dalších podadresářů.

Aha, takže kořenový adresář bude první prvek pole, které se bude průběžně procházením adresářů doplňovat a patrně se k tomu bude tvořit další pole s nalezenými hodnotami, něco jako
 

$adresar[0]["pocet"] = 5;
$adresar[0]["cesta"] = "/anime";
Nahlásit jako SPAM
IP: 94.113.138.–
Kit+15
Guru
3. 1. 2016   #4
-
0
-

#3 VelkyBubak
S traverzováním nejsou žádné problémy, nic nemusíš ukládat. Pokud narazíš na podadresář, zavoláš funkci/metodu, která ho zpracuje. Po návratu nerušeně pokračuješ tam, kde jsi přestal.

V tom tvém kódu by ses měl zbavit té nuly, ta ti tam bude dělat paseku, až budeš dělat s podadresáři. Jednodušší (a rychlejší) zápis: 

<?php
$adresar = array(array("pocet" => 5, "cesta" => "/anime"));

// přidání dalšího adresáře
$adresar[] = array("pocet" => 5, "cesta" => "/anime/subanime");

Jak vidíš, indexy nejsou potřebné.

Nahlásit jako SPAM
IP: 194.228.13.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
peter
~ Anonymní uživatel
4016 příspěvků
4. 1. 2016   #5
-
0
-

   

a / b
a / c
a / d / e
a / d / f
a / g


0, b //path a
0, c
0, d
0, g
// spustis detekci na adresare v prave vypsanem seznamu od 0 az po konec seznamu
// 'b' neni adresar, 'c' take ne, 'd' je adresar, dopises dalsi radek do seznamu
2, e // 2 je cislo radku v seznamu pro 'd'
2, f
// opet spustis detekci na adresare od radku 5 az po konec seznamu
// e, f nejsou adresare, konec vypisu
// kdyz tam budou adresare dva, tak v seznamu budes mit
2, e
2, f
3, h // kdyz bude i g adresar se souborem h

Pocet souboru v adresari? Tak, jestli te zajima konkretni pocet, tak muzes pocet souboru pocitat prubezne a jen ulozit cestu, kdyz to prekroci limit.

Jestli by treba nebylo lepsi pouzit nejakeho linux prikazu. Mozna, ze se spravnymi parametry to udela presne to, co potrebujes 10x rychleji.

Nahlásit jako SPAM
IP: 2001:718:2601:26c:69cd:53...–
peter
~ Anonymní uživatel
4016 příspěvků
4. 1. 2016   #6
-
0
-

Treba windows dir umi vypsat seznam vsech souboru a podadresaru. Linuxovym grep by se z toho dali mozna ty pocty vytahnout.

Nahlásit jako SPAM
IP: 2001:718:2601:26c:69cd:53...–
VelkyBubak0
Newbie
4. 1. 2016   #7
-
0
-

#6 peter
Mám ti na to odpovídat, nebo si znovu přečteš můj příspěvek č. #3 ? Přesněji: mám přístup jen k php/mysql/ftp. Co z toho ti nebylo jasné? Jinak ano, pokud bych měl přístup k shellu, dá se to udělat více způsoby.

Nahlásit jako SPAM
IP: 94.113.138.–
Řešení
VelkyBubak0
Newbie
4. 1. 2016   #8
-
0
-
Vyřešeno Nejlepší odpověď

takže jsem to udělal takto:

$slozka_cesta = array("..");
$vypis;
$soubor = 0;
$slozka = 0;

function adresar_add ($pridej) {
	global $slozka_cesta, $slozka;
	$slozka_cesta[] = $pridej;
	$slozka++;
}

function vypis_add ($cesta,$souboru,$slozek) {
	global $vypis;
	$vypis[] = array("pocet_souboru" => $souboru, "pocet_slozek" => $slozek, "cesta" => "$cesta");

}

function soubor_add () {
	global $soubor;
	$soubor++;
}
 
function overeni ($cesta,$over) {
	if (is_dir($cesta."/".$over) && $over !== '.' && $over !== '..') {
		adresar_add($cesta."/".$over);
	} else if (is_file($cesta ."/". $over) && $over !== '.' && $over !== '..') {
		soubor_add();
	}
}
 
function adresar($kde) {
	if (is_dir($kde)) {
		$adresar = opendir($kde);
		while (false !== ($cteni = readdir($adresar))) {
			overeni($kde,$cteni);
        	}
        closedir($adresar); 
    	}
}

function tree_vypis_spoustec($koren) {
	global $slozka_cesta, $slozka, $soubor;
	$slozka = 0; $soubor = 0;
	adresar($koren);
	
	vypis_add($koren,$soubor,$slozka);
}

function tree() {
	global $slozka_cesta, $slozka, $soubor;

	if (count($slozka_cesta) > 0) {
		foreach($slozka_cesta as $cesta) {
			array_shift($slozka_cesta);
			tree_vypis_spoustec($cesta); 
		}
	
	if (count($slozka_cesta) > 0) tree();
	
	}
}

tree();

Nakonec se to nevypisuje jako stromová struktura, ale podle úrovní zanoření - tj. nejprve ten první nastavený v $slozka_cesta od začátku, pak jeho podadresáře, pak podadresáře jeho podadresářů atd. Nicméně pro mou potřebu to více než postačuje.
 

Nahlásit jako SPAM
IP: 94.113.138.–
Kit+15
Guru
4. 1. 2016   #9
-
0
-

#8 VelkyBubak
Fuj global! Pryč s tou zrůdou!

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:6457:...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
VelkyBubak0
Newbie
5. 1. 2016   #10
-
0
-

#9 Kit
Ok, předpokládám že jsou jinak dvě možnosti.

Buď to pomocí PHP5+ přepsat na objekt (kde by asi global nebylo třeba ale netuším zda by to šlo i v PHP4, které jsem měl k dispozici), nebo se nezatěžovat spešl funkcema na každou prkotinu..

Nahlásit jako SPAM
IP: 94.113.138.–
Kit+15
Guru
5. 1. 2016   #11
-
0
-

#10 VelkyBubak
Je zajímavé, že tě při tom všem psaní vůbec nenapadlo použití rekurze.

Nahlásit jako SPAM
IP: 194.228.13.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 49 hostů

Podobná vlákna

Počty-dotazy — založil xjx

Kupecké počty — založil Martin

Jednoduche pocty — založil Hlavinka

Pocty podgrafu grafu — založil sorce

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý