Autor Zpráva
sonix
Profil
Zdravím. Potřebuju od Vás zkušených radu, jak stáhnout více složek najednou pomocí nějakého scriptu? Pro lepší pochopení zkusim ještě trochu vysvětlit. Mám koženový adresář (root) a v něm mám více složek, a v každé té složce je pár souborů a potřebuju je stáhnou pomocí scriptu. :) Poradí někdo? Přemýšlel jsem nad tím a jediný co mě napadlo tak zjistit všechny adresáře a pak je postupně stahovat pomoci while(). Jde o to, stáhnout všechny soubory a adresáře z rootu. Takže by to mohlo ještě jít tak, že se všechny soubory přidají do archivu, a ten se pak nabídne ke stáhnutí. Prosím o pomoc rozlousknutí tohoto oříšku.
Alphard
Profil
musíš se rozhodnout, jak chceš stažení provést, adresář stáhnout nelze, lze stahovat pouze soubory, nebo archiv, ve kterém mohou být zachované adresáře
PHP umí pracovat třeba se ZIP
a pokud jde o princip, záleží na požadavcích, ale asi nejlepší by byla rekurzivní funkce, zvládne práci se soubory zanořenými do x adresářů
sonix
Profil
podle meho rozhodnuti by ta funkce, jak jsi zminoval, byla vhodna... jde o to, že v nějaké složce je například další podsložka, ve ktere jsou další adresáře atd..
Alphard
Profil
jde o to, že v nějaké složce je například další podsložka, ve ktere jsou další adresáře atd..
právě proto doporučuji rekurzivní funkci, na tohle je jako stvořená...
sonix
Profil
jj rekurzivní fce o nich jsem někde četl... mohl by jsi mi pomoc s konstrukcí kodu?
Alphard
Profil
dám sem script vypisující rekurzivně jednotlivé adresáře a soubory, k pochopení doporučuji nejprve spustit v adresáři se složitější strukturou a prohlédnout výstup, až potom editovat :-)

snad to funguje, tu svoji archivní funkci teď nemohu najít, tak jsem v rychlosti napsal tohle

<?php
function vypis_soubory ($cesta = ".")
  {  echo "<li><b>".$cesta."/</b></li>\n";
     echo "<ul>";
     $r = scandir ($cesta);
     foreach ($r as $file)
       {  if ($file == "." || $file == "..") continue;
          if (is_dir ($cesta."/".$file)) vypis_soubory ($cesta."/".$file);  };

     foreach ($r as $file)
       {  if ($file == "." || $file == "..") continue;
          if (!is_dir ($cesta."/".$file))
            {  echo "<li>".$file."</li>\n";  }  }
    echo "</ul>\n";  }

function schema ($cesta = ".")
  {  echo "<ul>\n";
     vypis_soubory ($cesta);
     echo "</ul>\n";  }

schema();
?>


využívá funkci scandir(), ta je až v PHP 5, ale snad to není problém
s pomocí http://cz2.php.net/zip snad nebude problém to upravit
PS: sám si chci již docela dlouhou funkci na balení adresářů vytvořit, jestli ji udělám v dohledné době, tak ji sem vložím
sonix
Profil
dík
sonix
Profil
Good work! ;-) fakt moc díky. BTW říká ti něco shell script?
Alphard
Profil
BTW říká ti něco shell script?
říká, ale netuším, k čemu ti tahle informace bude :-) tady nejsme na chatu
sonix
Profil
hoj. nenasel jsi ten script na stazeni toho stromu?
Alphard
Profil
sonix
našel, ale zjistil jsem, že je to třída, na které jsem kdysi začínal s OOP na PHP 5, snad jsem neudělal nějakou chybu :-)
následující script vlož ideálně do rootu, pak ho zavolej a v závislosti na počtu souborů mu dej trochu času, měl by ve stejném adresáři (root) vytvořit soubor zip.zip (název lze změnit) s archivem současného adresáře, tedy root
Pozn. teoreticky by se zadáním jiné cesty jako argumentu měl balit i nadřazené adresáře, ale nejsem si jist, jak jsem ho vyladil, takže doporučuji umístit do rootu
Pozn2. vyžaduje knihovnu zip (nastavuje se v php.ini), není-li k dispozici, lze očekávat chybu Fatal error: Class 'ZipArchive' not found in např. na free profituxu nefunguje
<?php
class Zipuj {

protected $zip;
public $jmeno_zipu;
public $root;

  public function __construct ($root = ".", $jmeno_zipu = "zip.zip") {
    $this -> root = $root;
    $this -> jmeno_zipu = $jmeno_zipu;
    $this -> zip = new ZipArchive();
    $this -> zip -> open ($this -> jmeno_zipu, ZIPARCHIVE::CREATE);
    self::nactiAdr ($this -> root);
    self::uloz ();
  }

  public function nactiAdr ($cesta) {
    $hn = scandir ($cesta);
    foreach ($hn as $file)
       {  if ($file == "." || $file == "..") continue;
          if (is_dir ($cesta."/".$file)) {
              $this -> zip -> addEmptyDir ($cesta."/".$file);
              self::nactiAdr ($cesta."/".$file);
            }
           else
            $this -> zip -> addFile ($cesta."/".$file, $cesta."/".$file);  }
  }
  public function uloz () {
    $this -> zip -> close ();
  }
}

$zalohuj = new Zipuj();
?>
sonix
Profil
mohl by jsi mi dat ICQ nebo mail? to o cem se s tebou chci bavit sem jaksi nepatri a nechci to tu rozebirat verejne, tak se prosimte ozvy na mail kyllee@seznam.cz
šoraj
Profil
Ahoj Alphard,
měl bych dotaz, jak zabalit pomoc tveho skriptu adresář, ale bez nadřazených složek??předem děkuji za tvoji odpověď!
fuńguje mi to, ale zabali to celou cestu..jsem zacatecnik, tak nevim, jak na to..dik

Vaše odpověď

Mohlo by se hodit

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

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