12 commenti php

Le operazioni che è possibile eseguire con le cartelle sono molteplici: in particolare creazione, lettura, verifica dell’esistenza, e non solo. Vediamo alcune delle funzioni che possono consentirci di eseguire tali operazioni.

 

 

LA FUNZIONE IS_DIR()

La funzione is_dir() verifica l'esistenza una cartella. Essa accetta come unico parametro una stringa corrispondente al percorso alla cartella (senza il simbolo / alla fine).

Restituisce un valore boleano, TRUE se la cartella esiste.

 

Esempio:

<?php
$cartella = 'cartella/sottocartella';
if(!is_dir($cartella))
   {
   echo 'La cartella indicata non esiste!';
   }
else
   {
   echo 'La cartella esiste!';
   }
?>

 

 

LE FUNZIONI OPENDIR(), READDIR(), CLOSEDIR()

Tali funzioni servono per aprire un cartella, leggerne il contenuto e chiuderla.

La funzione opendir() serve per aprire una cartella. Essa richiede come parametro una stringa indicante il percorso.
Restituisce come return l'identificativo della risorsa in caso di successo, altrimenti FALSE generando un errore di tipo warning.

La funzione readdir() serve per leggere il contenuto di una cartella. Essa richiede come parametro l'identificativo della risorsa ottenuto con opendir().
Tuttavia, essa richiede una specifica esecuzione per ogni file, sottocartella presente, più altri due esecuzioni in cui si estraggono i simboli '.' e '..' (rappresentanti la cartella corrente e la sua cartella madre). Al termine restituirà FALSE.
A tal scopo le varie esecuzioni di readdir() possono essere gestite con il ciclo while().

La funzione closedir() chiude la risorsa. Restituisce TRUE in caso di successo, FALSE in caso di fallimento.

Vediamo il loro utilizzo:

<?php
// indichiamo la cartella da aprire
// il simbolo . indica la cartella corrente
$cartella = '.';

// verifichiamo che la cartella esiste
if(!is_dir($cartella))
   {
   exit('La cartella indicata non esiste!');
   }

// apriamo la cartella
$risorsa = opendir($cartella) or die('impossibile aprire la cartella!');

// con il ciclo while eseguiamo più volte la funzione readdir()
// valorizzando la variabile $file
// fin quando essa non darà come risultato FALSE
while(($file = readdir($risorsa)) !== FALSE) 
   {
   echo $file."<br />";
   }

// chiudiamo la cartella
closedir();
?>

 

 

LA FUNZIONE SCANDIR()

La funzione scandir() esegue la lettura dei file e le cartelle presenti in una cartella restituendone i nomi all'interno di un array. Essa è utilizzabile sono nelle versioni di php superiori alla 5. 

Essa accetta due parametri: il primo è una stinga indicante il percorso alla cartella; il secondo opzionale determina l'ordine di estrazione può assumere valori 0, per ordinare alfabeticamente, o 1, per ordinare in sesno inverso.

Restituisce un array i cui elementi sono costituiti dai nomi dei file e cartelle presenti.

 

Vediamone un esempio:

<?php
// indichiamo la cartella da aprire
// il simbolo . indica la cartella corrente
$cartella = '.';

// verifichiamo che la cartella esiste
if(!is_dir($cartella))
   {
   exit('La cartella indicata non esiste!');
   }

// creaimo un array con tutti i file
$array_file = scandir($cartella) or die ('Impossible leggere la cartella!');

// stampiamo i valori
foreach ($array_file as $key => $value)
   {
   echo $value."<br />";
   }
?>

 

LA FUNZIONE GLOB()

La funzione glob() serve per elencare i file presenti in una cartella con la possibilità di indicare il tipo di estensione che debbono avere i file. E' attiva solo nelle versioni di php superiori alla 4.3.

Essa accetta due parametri: il primo è una espressione indicante il percorso alla cartella e i file da selezionare; il secondo opzionale è una costante che potrà assumere diversi valori determinando una diversa interpretazione dell'espressione.

Restituisce un array i cui elementi sono costituiti dai file selezionati.

 

Vediamone il suo utilizzo:

<?php
// selezioniamo solo i file con estensione .php
$array_file = glob('cartella/*.php');

foreach ($array_file as $key => $value)
   {
   echo $value."<br />";
   }
?>

 

Poniamo che da una cartella contenente delle immagini vogliamo estratte tutti i file .jpg, .jpeg, .bmp, e .gif. 
In tal caso la funzione glob() verrà impiegata con tale sintassi:

<?php
// selezioniamo i file con estensione .jpg, jpeg, .png e .gif
$array_file = glob("immagini/*.{jpg,jpeg,gif,png}", GLOB_BRACE);

foreach ($array_file as $key => $value)
   {
   echo '<img src="'.$value.'">';
   }
?>

 

Vai alla lezione successiva

Vai alla lezione precedente

Olimpio Romanella

Sono un appassionato di Web Developing con un particolare debole per php. Mi dedico principalmente dello sviluppo back-end ed in particolare programmazione lato server con php, sviluppo di database relazionali MySql e progettazione di CMS di piccole e medie dimensioni.

Mi avvalgo del framework javascript Jquery, utilizzando molti dei suoi plugin e nei dei miei progetti utilizzo spesso il framework MVC Codeigniter.

12 Commenti presenti

avatar Mattia

Mattia

23 December 2015 ore 13:26

@Olimpio Romanella: Ma infatti vorrei solo le cartelle, che esistono. eppure non mi stampa mai nulla, nemmeno rimuovendo GLOB_ONLYDIR mi stampa nulla, ne directory, ne files...

avatar Mattia

Mattia

23 December 2015 ore 13:24

se poi non ne approfitto troppo, ho un altro problema sempre connesso al selettore che sto cercando di creare.



<?php
//definisco l'array di tutte le cartelle contenute in archivio (ovvero i clienti)
$scandir_archivio = scandir("archivio");
//inizio il primo ciclo con cui estrappolo dalla cartella archivio i link dei clienti
foreach ($scandir_archivio as $Cartelle_cliente) {
echo '<a href="?cliente='.$Cartelle_cliente.'">'.$Cartelle_cliente.'</a><br>';
};


//richiamo con la funzione GET la variabile cliente selezionata dal link precendete
$Cliente_from_GET = $_GET[cliente];
//definisco l'array di tutte le cartelle contenute nella cartella cliente selezionata dal link precedente
$scandir_cliente = scandir("archivio/" .$Cliente_from_GET);
//inizio il secondo ciclo con cui estrappolo dalla cartella clienti selezionata i link degli anni
foreach ($scandir_cliente as $Cartelle_anno) {
echo '<a href="?cliente='.$Cliente_from_GET .'&anno=' .$Cartelle_anno.'">'.$Cartelle_anno.'</a><br>';
};


//richiamo con la funzione GET la variabile anno selezionata dal link precendete
$Anno_from_GET = $_GET[Anno];
//definisco l'array di tutte le cartelle contenute nella cartella cliente selezionata dal link precedente
$scandir_Anno = scandir("archivio/" .$Cliente_from_GET ."/" . $Anno_from_GET);
//inizio il secondo ciclo con cui estrappolo dalla cartella clienti selezionata i link degli anni
foreach ($scandir_anno as $Cartelle_mese) {
echo '<a href="?cliente='.$Cliente_from_GET .'&anno=' .$Anno_from_GET .'&mese=' .$Cartelle_mese.'">'.$Cartelle_mese.'</a><br>';
};
?>



questo è il risultato che ottengo:


<a href="?cliente=.">.</a><br><a href="?cliente=..">..</a><br><a href="?cliente=1">1</a><br><br />
<b>Notice</b>: Use of undefined constant cliente - assumed 'cliente' in <b>C:\xampp\htdocs\[test]\AreaRiservata\archivio-selettore2.php</b> on line <b>11</b><br />
<br />
<b>Notice</b>: Undefined index: cliente in <b>C:\xampp\htdocs\[test]\AreaRiservata\archivio-selettore2.php</b> on line <b>11</b><br />
<a href="?cliente=&anno=.">.</a><br><a href="?cliente=&anno=..">..</a><br><a href="?cliente=&anno=1">1</a><br><br />
<b>Notice</b>: Use of undefined constant Anno - assumed 'Anno' in <b>C:\xampp\htdocs\[test]\AreaRiservata\archivio-selettore2.php</b> on line <b>21</b><br />
<br />
<b>Notice</b>: Undefined index: Anno in <b>C:\xampp\htdocs\[test]\AreaRiservata\archivio-selettore2.php</b> on line <b>21</b><br />
<br />
<b>Notice</b>: Undefined variable: scandir_anno in <b>C:\xampp\htdocs\[test]\AreaRiservata\archivio-selettore2.php</b> on line <b>25</b><br />
<br />
<b>Warning</b>: Invalid argument supplied for foreach() in <b>C:\xampp\htdocs\[test]\AreaRiservata\archivio-selettore2.php</b> on line <b>25</b><br />


non capisco perché la variabile anno quando viene aperta la pagina diventa equivalente alla variabile cliente, e perché il ciclo per creare i link dei mesi, quando seleziono l'anno, non funziona e mi da l'errore Invalid argument supplied for foreach()

Credi di potermi aiutare ad avere un codice funzionante a tutti gli effetti???

avatar Olimpio Romanella

Olimpio Romanella

23 December 2015 ore 13:18

@Mattia:
rimuovi il secondo parametro dalla funzione glog altrimenti ti restituira' solo le sottocartelle presenti e non i files.

avatar Mattia

Mattia

23 December 2015 ore 13:05

ciao Olimpo,
non capisco perche sia sul mio server di prova, in localhost su windows, che su un server aruba di cui detengo il dominio la funzione Glob() non funziona. o meglio mi restituisce sempre che nella cartella specificata non ci sono elementi.

il codice che ho scritto è questo... dove sta il problema???



//definisco l'array di tutte le cartelle contenute in archivio (ovvero i clienti)
$Glob_archivio = glob("archivio/*",GLOB_ONLYDIR);
//inizio il primo ciclo con cui estrapolo dalla cartella archivio i link dei clienti
foreach ($Glob_archivio as $Cartelle_cliente)
{
echo '<a href="?cliente='.$Cartelle_cliente.'">'.$Cartelle_cliente.'</a><br>';
};



non capisco anche perché lo stesso percorso specificato con la funzione @scandir funziona, ed il codice che utilizzo è il seguente.



//definisco l'array di tutte le cartelle contenute in archivio (ovvero i clienti)
$Scandir_archivio = scandir("archivio");
//inizio il primo ciclo con cui estrapolo dalla cartella archivio i link dei clienti
foreach ($Scandir_archivio as $Cartelle_cliente)
{
echo '<a href="?cliente='.$Cartelle_cliente.'">'.$Cartelle_cliente.'</a><br>';
};



che però mi da l'effetto indesiderato di stampare due elementi che non esistono, prima di quelli che esistono, in questo modo



<a href="?cliente=.">.</a><br>'
<a href="?cliente=..">..</a><br>'



Come posso risolvere i miei problemi???

avatar Olimpio Romanella

Olimpio Romanella

12 August 2015 ore 10:32

@Fabio:
ciao Fabio, anzitutto devi prestare maggiori attenzione alla variabile get che utilizzi nel tuo script.
Venendo poi alla questione che dicevi devi creare un tipo di funzione che vengono definite "recursive" (cioé richiamano se stesse al loro interno).


function read_all_files($root = '.'){
$files = array('files'=>array(), 'dirs'=>array());
$directories = array();
$last_letter = $root[strlen($root)-1];
$root = ($last_letter == '' || $last_letter == '/') ? $root : $root.DIRECTORY_SEPARATOR;

$directories[] = $root;

while (sizeof($directories)) {
$dir = array_pop($directories);
if ($handle = opendir($dir)) {
while (false !== ($file = readdir($handle))) {
if ($file == '.' || $file == '..') {
continue;
}
$file = $dir.$file;
if (is_dir($file)) {
$directory_path = $file.DIRECTORY_SEPARATOR;
array_push($directories, $directory_path);
$files['dirs'][] = $directory_path;
} elseif (is_file($file)) {
$files['files'][] = $file;
}
}
closedir($handle);
}
}

return $files;
}

$dir = 'page/';
$array = read_all_files($dir);
echo '<pre>';
print_r($array);
echo '</pre>';


funzione tratta da http://php.net/manual/it/function.readdir.php

avatar Fabio

Fabio

11 August 2015 ore 12:27

@oly1982:

Ciao Olimpo,

A me servirebbe che mi leggesse le carettelle i file delle cartelle e le sottocartelle con i relativi file. Non sono riuscito a trovare un esempio buono. Lo script che adopero attaulemnet è il seguente:




$sub = ($_GET['dir']);
$path = 'c:\\';
$path = $path . "$sub";
$dh = opendir($path);
$i=1;
while (($file = readdir($dh)) !== false) {
if($file != "." && $file != "..") {
if (substr($file, -4, -3) =="."){
echo "$i. $file <br />";
}else{
echo "$i. <a href='?dir=$sub/$file'>$file</a><br />";
}
$i++;
}
}
closedir($dh);


Se lo provi vedrai che ti fa una serie di elenco delle cartelle sottolineate. Dove cliccando ci puoi vedere il loro contenuto senza conoscere il percorso. Invece a me servirebbe che si aprissero tutte con il percorso. Mi puoi dare una mano a moodificare tale script ??? Inoltre lo dovrei memorizzare in un db. Ovviamente il contenuto. non tutti i programmi che ci sono. Grazie sono in attesa di una tua risposta al più breve.

avatar Fabio

Fabio

07 August 2015 ore 17:38

Ciao Olimpio,

il tuo esempio funziona alla grande ma legge solo le direcory, a me servierebbe leggere anche il contenuto delle directory lette come si potrebbe fare ??? Ti prego aiutami perchè non sono riuscito a rislvere il problema. Sono mesi che ci sto combattendo. Spero di ricevere al più presto una tua risposta con un'esempio pratico. Ah dimenticavo lo dovrei memorizzare su un db il risultato finale. Grazie aspetto presto le tue notizie.

avatar Olimpio Romanella

Olimpio Romanella

21 November 2014 ore 09:58

@prince: non e' molto chiaro cio' che chiedi. Ma, andando ad intuito, credo che sia possibile cio' che intendi.

avatar prince

prince

20 November 2014 ore 17:02

è possibile inserire un immagine in un percorso variabile? ad esempio io ho il nome della cartella dove destinare il file sotto forma di variabile, è possibile fare l'upload su questa cartella?

avatar webskey

webskey

06 November 2011 ore 17:43

in anzi tutto grazie per avermi risposto cosi in fretta
e mi scuso forse sono stato troppo ristretto nel spiegare la cosa cmq il fatto e che devo fare un script che riconosca la cartella nella sotto cartella del sito web senza dover specificare la destinazione egni volta ess: se devo copiare lo script dentro la cartella di nome public/cartella/files o pure public/nuova _cartella/files il file xml dovrebbe cmq trovare la cartella files senza che io la debba specificare ogni volta la destinazione in pratica dovrebbe leggere sempre dentro la cartella files ovunque si trovi la script _cartella/files il file xml dovrebbe cmq trovare la cartella files senza che io lo debbe specificare ogni volta la destinazione in pratica dovrebbe leggere sempre dentro la cartella files ovunque si trovi la script Visualizza altro
in pratica se scrivo cosi mi trova la cartella ma solo se posta sulla cartella principale del mio dominio <security name="ImageGalleryPath">/files</security>

avatar oly1982

oly1982

06 November 2011 ore 14:53

Onestamente non ho capito il tuo problema. Cerca di essere più chiaro.

Quale è lo script che attualmente utilizzi?
Cosa vorresti che facesse ed invece non fà?

avatar webskey

webskey

06 November 2011 ore 14:46

salve tutti scusate se posto stà domanda forse un po ridicola
ma non so piu a che santo votarmi visto che qui si parla spesso di geni della programmazione
mi chiedevo se cera qualche utente di buon cuore per darmi un piccolo aiuto, stò facendo un
sito web ma mi sono bloccato da piu di 2 settimane su una funzione che non riesco a fare funzionare,
in pratica dovrei fare un percorso assoluto dentro una pagina xml con questo script
<security name="ImageGalleryPath">('files/')</security>
mi rileva solo il contenuto nella cartella files ma solo se si trova nel percorso pricipale
del dominio non riesco a farlo funzionare se vorrei inserire la cartella file in altre sottocartelle senza
specificare la destinazione ogni volta sono disperato vi prego a cuasi natale siate buoni se ce un esperto
programmatore che legge questo messaggio gli chiedo di buon quore di darmi una mano, altrimenti finirò in
manicomio a cercare di creare questa funzione nel mio sito web Visualizza altro