Autor | Zpráva | ||
---|---|---|---|
Blitz Profil * |
#1 · Zasláno: 19. 6. 2011, 08:40:04
Ahoj,
rád bych vás požádal o pomoc, potřebuju vypisování souborů, kde si můžu vybrat, které soubory se nevypíší ("systémové"). Mám vypisování souborů tedy tímto způsobem: function GetDirArray($sPath,&$ret,&$dir) { global $time0, $MAXTIME, $timeover; if ((time()-$time0)>$MAXTIME) { $timeover = 1; return; } $handle=opendir($sPath); while ($file = readdir($handle)) { $polozky[count($polozky)] = $file; } closedir($handle); sort($polozky); while (list($key, $val) = each($polozky)) { if ($val != "." && $val != "..") { $path = str_replace("//","/",$sPath.$val); $path2 = substr($path,2); $ret[count($ret)] = $path2; if (is_dir($sPath."/".$val)) { $dir[count($dir)] = 1; GetDirArray($sPath."/".$val."/",$ret,$dir); } else { $dir[count($dir)] = 0; } } } } $MAXTIME = 60; $time0 = time(); $timeover = 0; $cwd = getcwd(); //echo "<font color=\"#808080\">Adresář \"$cwd\"</font>"; GetDirArray("./",$ret,$dir); if ($timeover) { echo "Provadeni skriptu preruseno,"; echo "uplynul maximalni povoleny cas ($MAXTIME sek.)<br><br>\n"; } while (list($key, $isdir) = each($dir)) { list($key, $file) = each($ret); if($isdir==1) { echo "(DIR) <a href=\"$file\">$file</a><br>\n"; } } echo "\n"; reset($dir); reset($ret); while (list($key, $file) = each($ret)) { list($key, $isdir) = each($dir); if($isdir==0) { //dále je echo, napsal jsem jen začátek kódu, protože dále nic důležitého není Lze to nějak udělat? Mockrát děkuji za námahu, stačilo by jenom nějaké nakopnutí, dodělám to sám :-) |
||
Jozin Profil |
#2 · Zasláno: 19. 6. 2011, 09:04:22
Zdravím,
asi úplně nechápu důvod tolika cyklů. Již v prvním cyklu je možné zpracovávat data, jako je v druhém cyklu. Navíc, pokud chceš přidat pole, tak se to nedělá $pole[count($pole)], ale $pole[], zbytečně to počítá počet polí. Dále by ta funkce měla vracet ten seznam souborů. Tudíž ti tam někde chybí return. K tvému "problému", do parametrů funkce přidej array $ignored_file. Při ukládání souborů do proměnné dáš jednoduchou podmínku if(!in_array($ten_soubor, $ignored_file)) //vloz do promenne soubor. Snad jsem trochu pomohl, Jozin. |
||
Blitz Profil * |
#3 · Zasláno: 19. 6. 2011, 09:20:58
Jozin:
No, důvodem bylo to, že tento skript, umí procházet adresáře s tím, že je jen jeden. Uměl bych to napsat kratší, ale potom bych do každého adresáře musel tento soubor dávat - takhle stačí jen jeden. $pole[count($pole)] - to vadí hodně? Je to jen pro osobní použití a mně to rozhodně nevadí. Chvíli mi trvalo, co jsi myslel tím $ten_soubor :-D. OK, ale teď nechápu, kam si myslel dát to if(!in_array($ten_soubor, $ignored_file))? |
||
Tori Profil |
#4 · Zasláno: 19. 6. 2011, 10:10:02 · Upravil/a: Tori
Blitz:
„$pole[count($pole)] - to vadí hodně?“ No když předpokládáte, že by ten skript mohl běžet tak dlouho, že mu nastavujete timeout, tak by vám každé zdržení mělo vadit. ;) Funkce glob implicitně řadí výsledky, s ní by vám stačil jen jeden cyklus foreach. Místo čtení globálních proměnných by šlo funkci upravit tak, aby dostala navíc jeden nepovinný parametr (ten $MAXTIME) a vracela true/false jako timeout. „kam dát to if(!in_array($ten_soubor, $ignored_file))?“ Tak kde ukládáte názvy nalezených souborů. Jozin: Vrací to referencí. |
||
Jozin Profil |
#5 · Zasláno: 19. 6. 2011, 11:57:27
Tori:
Ano vrací to referenci, ale to mi příjde, jako zbytečné, přidávání parametrů... Ale to je individuální souhlasím, že tedy stačí reference. Blitz: Nějak nechápu jak ovlivní 2 cykly změní potřebu vkládání souboru s funkcí do jiného adresáře. Dá se to prostě zjednodušit/zrychlit. |
||
Blitz Profil * |
#6 · Zasláno: 19. 6. 2011, 18:27:00
Stejně mi to pořád nefungujue :-(. Kam přesně to mám dát?
|
||
Jozin Profil |
#7 · Zasláno: 19. 6. 2011, 18:57:28 · Upravil/a: Jozin
Tak jsem si dal tu práci a celou funkci přepsal, snad funguje jak má... zkoušel jsem ji jen na rychlo, protože na to nemám moc času, kdyby něco nefungovalo, stačí napsat:
<?php function getDirArray($base_path, array $ignored_files = array(), $maxtime = 60, $start_time = 0) { if( (!is_numeric($maxtime) || $maxtime <= 0) || (!is_numeric($start_time) || $start_time < 0) || (!is_dir($base_path)) ) return false; //chybny vstup if($start_time == 0) $start_time = time(); $ret = array(); $handle=opendir($base_path); while($file = readdir($handle)) { if($file == "." || $file == ".." || in_array($file, $ignored_files)) continue; $path = str_replace("//", "/", $base_path . '/' . $file); $dir = is_dir($path); $ret[] = array( 'path' => $path, 'dir' => $dir ); if($dir == true) getDirArray($path, $maxtime, $start_time); if((time()-$start_time) > $maxtime) { $ret['time_over'] = true; return $ret; } } closedir($handle); return $ret; } výstupem je něco takového: array( [0] => array( 'path' => 'cesta_k_souboru', 'dir' => false ), [1] => array( 'path' => 'cesta_k_podslozce', 'dir' => true ), ) snad je to pochopitelné EDIT: pokud příjde na timeover, tak se definuje v poli klíč 'time_over' s hodnotou true, takže to jednoduše ověříš if(isset($vystup['time_over'])) echo "Script přerušen.'; |
||
Časová prodleva: 13 let
|
0