Autor Zpráva
Jacobus
Profil *
Dobrý den,

chtěl bych požádat o radu, mám jednoduchý kód, který by dle mého názoru fungoval, nebýt hned první řádky kde definuji cestu která se má prohledávat. Jde mi o výpis všech souborů rekurzivně ze zadané cesty. Mohl by mi prosím někdo poradit, jak definovat správně tuto cestu? Vadí poslední lomítko...
<?php
$main_dir="C:\Program Files\cesta\adr\adr2g\retry\";
function get_subdir_files($main_dir) {
    $dirs = scandir($main_dir);
        foreach($dirs as $dir)  {
            if ($dir === '.' || $dir === '..') {
                continue; }
            $files=scandir($main_dir."/".$dir);
                foreach ($files as $file)  {
                if ($file === '.' || $file === '..') {
                    continue;
                } else {
                    $result[]=$main_dir.'/'.$dir.'/'.$file;
                    }
                }
    }   
    return $result;
}
?>
SeparateSK
Profil
Namiesto \ použi \\
$main_dir="C:\\Program Files\\cesta\\adr\\adr2g\\retry\\";
Jacobus
Profil *
Děkuji za radu, zkoušel jsem zdvojené lomítko jen na konci řetězce, toto pomohlo. Nicméně se zdá že mám ještě nějakou chybičku, cesta se mi vypisuje ok, ale nevypíše to žádný soubor, přitom tam jsou. Moc děkuji!
SeparateSK
Profil
Trochu som to upravil :)
$main_dir="C:\\Program Files\\cesta\\adr\\adr2g\\retry";
function get_subdir_files($main_dir) {
    $dirs = scandir($main_dir);
    $mdir=false;
    foreach($dirs as $dir)  {
        if ($dir == '.' || $dir == '..') {
            $mdir=true;
        }
        if(is_dir($dir)){
            $files=scandir($main_dir."\\".$dir);
            foreach ($files as $file)  {
                if ($file == '.' || $file == '..') {
                    continue;
                } else {
                    if($mdir && $dir==".")$result[]=$main_dir.'\\'.$file;
                        else
                            if($dir!="..") $result[]=$main_dir.'\\'.$dir.'\\'.$file;
                }    
            }
        }
        $mdir=false;
    }   
    return $result;
}
$result=get_subdir_files($main_dir);
for($i=0;$i<count($result);$i++){
    echo $result[$i]."<br>";
}
Teraz by to malo preskenovať celú zložku a všetky zložky v nej.

Mimochodom to lomítko na konci nemusí byť.
Jacobus
Profil *
Veeeelice děkuji za pomoc. :)
Joker
Profil
Jacobus, SeparateSK:
Pokud úkol je: „Jde mi o výpis všech souborů rekurzivně ze zadané cesty.“, co podadresáře ve druhé (a další) úrovni (main_dir/subdir1/subdir2 atd)?

Nebylo by lepší, kdyby ta funkce volala rekurzivně sama sebe?
Jacobus
Profil *
Tak je to stejně špatně. :) Vypíše to v pořádku podadresáře a soubory z hlavního adresáře, ale soubory podadresářů to vynechá.
ShiraNai7
Profil
Proc to neudelat jednoduseji?

function get_subdir_files($path)
{
    $result = array();
    foreach(new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path), RecursiveIteratorIterator::CHILD_FIRST) as $item) {
        if($item->isFile()) $result[] = $item->getPathname();
    }
    return $result;
}
Jacobus
Profil *
ShiraNai7:
Protože první řešení funguje alespoň částečně, to snazší ne. :)
ShiraNai7
Profil
Jacobus:
Me funguje.. testoval jsem to. Samozrejme za predpokladu ze jedes na verzi PHP co neni starsi vice jak 6 let.. (!)
Jacobus
Profil *
ShiraNai7:
Zajímavé, opravdu mi to nejde. $path definujete jako: $path="C:\\Program Files\\cesta\\adr\\adr2g\\retry"; ? Žádnou php chybu mi to nevypisuje.


ShiraNai7:
[root@tower ~]# php -v
PHP 5.3.3 (cli) (built: May 7 2012 20:13:47)
Copyright (c) 1997-2010 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies
[root@tower ~]#


Pardon, nedošlo mi že tohle řeším na jiném serveru, tam je ale 5.2.
ShiraNai7
Profil
Jacobus:

A určitě máš zapnuté vypisování všech chyb?

edit: stačí php 5.1 nebo novější určitě
Jacobus
Profil *
Opravdu vůbec žádná chyba v php err logu.
Pro jistotu mohu přiložit celý script:

<?php
echo "No synt. err";
$path="C:\\Program Files\\cesta\\adr\\adr2g\\retry";
function get_subdir_files($path)
{
    $result = array();
    foreach(new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path), RecursiveIteratorIterator::CHILD_FIRST) as $item) {
        if($item->isFile()) $result[] = $item->getPathname();
    }
    return $result;

}
print_r($result);
?>
Keeehi
Profil
A co takhle třeba tu funkci zavolat co?
místo:
print_r($result);
toto:
print_r(get_subdir_files($path));
Jacobus
Profil *
Omlouvám se, už jsem se do toho díval asi moc dlouho. Ještě jednou děkuji za pomoc všech.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: