LORETTA B. forum

Linguaggi di programmazione => Php e MySql (data base) => Topic aperto da: micdas - Febbraio 09, 2009, 16:38:18

Titolo: gestione dei files: Leggere i files e sottocartelle di una cartella
Inserito da: micdas - Febbraio 09, 2009, 16:38:18
So che è una piccola cosa, ma alle volte può tornare utile saper leggere il contenuto di una cartella.
Qui di seguito vi mostro alcune diverse tecniche per eseguire questa operazione.

Mi scuserete se questo piccolo tutorial lo divido in più parti, ma questa cosa si rende necessaria per evitare confusione e per semplificarne la lettura.

Per leggere il contenuto della cartella.
Occorre  innanzitutto posizionarsi nella cartella da leggere. Per cui se la cartella da leggere è la stessa dove risiede lo script è suggiciente posizionarsi con un semplice
$dir = "./";
se è in altro posto basta indicare la posizione con
$dir ='./';
chdir($dir);


Vediamo subito le istruzioni per leggere e visualizzare il contenuto della cartella in esame:
Codice: Non sei autorizzato a vedere i links. Registrati o Login
<?php
// lettura dei files della cartella dove risiede il file con lo script
$dir "./";
if (is_dir($dir)) {
    if ($dh opendir($dir)) {
        while (($file readdir($dh)) !== false) {   // questo è un ciclo che si ripete fin tanto che non è stato letto tutto il contenuto della cartella
            echo $file "<br />\n";
}
closedir($dh);
    }
}
?>

Questo farà vedere una cosa del genere:
Citazione
default1.php
gest_file_05.php
gest_file_03.php
pagina5.php
matrici.php
macro003.htm
macro004.htm
php007.php
pagina.php
pagina4.php
variabili.php
php005.php
macro005.htm
php003.php
cartella2
mail_3.php
gest_file_02.php
pagina1.php
.
gest_file.php
php004.php
gest_file_04.php
..
pagina3.php

Come vedete nell'elenco sono indicati in modo confuso sia i files che le cartelle


Ma c'è un altro modo per ottenere un output più ordimato. Il metodo consiste nel determinare se l'oggetto letto è un file o una cartella e memorizzarlo in una o l'altra matrice per poi visualizzare, in modo ordinato prima una matrice e poi l'altra.

Prima fase: lettura e memorizzazione dei contenuti di una cartella in 2 distinte matrici una per le cartelle ed una per i files.
Per fare questo ci sono 2 istruzioni PHP:
if (is_dir($dir . $file)
.................
if (is_file($dir.$file))
Il significato di queste istruzioni è ovvio, immagino. Per cui passiamo subito alla presentazione del codice.

Codice: Non sei autorizzato a vedere i links. Registrati o Login
<?php
// lettura dei files della cartella dove risiede il file con lo script
$dir "./";
if (is_dir($dir)) {
    if ($dh opendir($dir)) {
        while (($file readdir($dh)) !== false) {
if ($file<>"." AND $file<>"..") {
if (is_dir($dir $file)){
            $folder[] = $file;
}
if (is_file($dir.$file)) {
            $file_trovati[] = $file;
}
}
}
closedir($dh);
    }
}
// .......................................... il resto del codice qui sotto
?>

Fatta questa operazione non ci resta che visualizzare il contenuto delle due matrici scorrendole semplicemente con un ciclo.
Codice: Non sei autorizzato a vedere i links. Registrati o Login
<?php
//  ........................... il resto del codice è qui sopra
        
if (is_array($folder) && count($folder) > 1) {
echo "<strong>Le cartelle trovate</strong><br />";
for($i=0;$i<count($folder);$i++) {
print $folder[$i] . "<br>\n";
}
}
echo "<hr>";
if (is_array($file_trovati) && count($file_trovati) > 1) {
echo "<strong>I files trovati</strong><br />";
for($i=0;$i<count($file_trovati);$i++) {
print $file_trovati[$i] . "<br>\n";
}
}
?>

Ecco. Per ora è tutto. nel prossimo post metteremo alla nostra routine dei filtri.
Titolo: applicazione dei filtri nel leggere i files
Inserito da: micdas - Febbraio 09, 2009, 16:59:12
Con questo vogliamo leggere sol dei files con determinate estensioni

Ora si può affinare la nostra esplorazione tra le cartelle. Col codice seguente ricerchiamo gli eventuali files con estensione .htm
Per fare questo e per facilitare la lettura del codice principale facciamo uso di una funzione che chiameremo quando necessario.
Qui di seguito vediamo la funzione seguita dal codice.
La funzione inizia con la dichiarazione del suo nome accompagnato da un argomento e finisce con la parentesi graffa di chiusura:
function estensione_file($string) {
// ...................................
}

Nel codice la funzione viene richiamata con l'istruzione:

$ext = estensione_file($file);

Siccome la funzione presenta un argomento ($string), il richiamo ad essa va effettuato indicando l'argomento da passare ($file).
Questo un probabile codice:

Codice: Non sei autorizzato a vedere i links. Registrati o Login
<?php
function estensione_del_file($string) { 
        
//parte prima la funzione
//Controllo il file
$trova_punto explode("."$string);
$estensione $trova_punto[count($trova_punto) - 1];
$estensione strtolower($estensione);
// Se non ci sono estensioni
if (isset($trova_punto[1]) == FALSE) {
return &#39;&#39;;
}
//Ritorno il valore dell&#39; estensione
return $estensione;
}
[
hr]
//     parte seconda la lettura e la scelta dei files
// lettura dei files della cartella dove risiede il file con lo script
$file_trovati = array();
$dir "./";
if (is_dir($dir)) {
    if ($dh opendir($dir)) {
        while (($file readdir($dh)) !== false) {
if ($file<>"." AND $file<>"..") {
$ext estensione_del_file($file);
if ($ext == "htm") {    // vengono accettati solo i files con estensione HTM
            $file_trovati[] = $file;
}
}
}
closedir($dh);
    }
}
//     parte terza la visualizzazione di quanto è stato letto
echo "<strong>I files trovati</strong><br />";
if (is_array($file_trovati) && count($file_trovati) > 1) {
for($i=0;$i<count($file_trovati);$i++) {
print $file_trovati[$i] . "<br>\n";
}
}
?>

L'elenco dei file risultanti mostrerà solo quei files che hanno una estensione .htm

Nel prossimo post vedremo come usare in modo intelligente la possibilità di applicare i filtri.
Titolo: Creazione dell'indice con doppio filtro
Inserito da: micdas - Febbraio 09, 2009, 17:42:11
Bene. Siamo arrivati alla conclusione di questa discussione.
Ora vedremo come creare dinamicamente dei menù (o indici) leggendo il contenuti di una cartella e creando dei link ad essi.

Per fare questo ci facciamo aiutare da due fattori:
un prefisso che metteremo ai files da linkare
il titolo che abbiamo usato servendoci del tag <title> ... </title>.

Per fare questo, sempre per ottimizzare il codice ho creato una seconda funzione. Quindi ci ritroviamo con 2 funzioni:
function estensione_file($string)
function leggi_titolo($file)


Mentre la prima funzione l'abbiamo vista nel post precedente, la seconda funzione esegue questo lavoro:

In questa funzione:
        leggiamo il contenuto del file in esame memorizzando il suo contenuto, riga per riga, in una matrice ($content)
        cominciamo a cercare tra le varie righe la stringa <title>
        trovata questa stringa la cancelliamo e resta la sola stringa contenuta tra <title> e </title
        interrompiamo il ciclo e torniamo alla routine principale.

Nella routine principale eseguiamo questo lavoro:

      ci spostiamo nella cartella da leggere
      iniziamo a leggere i files
      controlliamo che la estensione sia quella che cerchiamo
      il file deve avere un determinato prefisso, quindi controlliamo che nel nome del file ci sia anche questo
      se superiamo questi due test aggiungiamo il file nella matrice

Una volta letto tutto il contenuto della cartella e memorizzati i files desiderati nella matrice, prima di scriverli e lincarli leggeremo il contenuto del tag <title> ... </title> richiamando la funzione leggi_titolo().

Questo il codice che ho usato.

Codice: Non sei autorizzato a vedere i links. Registrati o Login
<?php
//   la funzione per leggere le estensioni dei files
function estensione_file($string) { 
//Controllo il file
$trova_punto explode("."$string);
$estensione $trova_punto[count($trova_punto) - 1];
$estensione strtolower($estensione);
// Se non ci sono estensioni
if (isset($trova_punto[1]) == FALSE) {
return &#39;&#39;;
}
//Ritorno il valore dell&#39; estensione
return $estensione;
}
[
hr]
// la funzione per leggere il contenuto del tag <title>
function leggi_titolo($file) {
$content file($file); 
foreach ($content as $stringa) {
// fra gli elementi che abbiamo letto dal file cerchiamo l&#39;esistenza del tag < title >
$substr substr_count($stringa, &#39;<title>&#39;);
if ($substr) {
$page_title $stringa;
// cancelliamo i tag <title> di apertura e chiusura
$page_title str_replace("<title>"""$page_title);
$page_title str_replace("</title>"""$page_title);
// usciamo prematuramente dal ciclo
break; 
        } 
}
return $page_title;
}
[
hr]
// lettura dei files della cartella dove risiede il file con lo script
$file_trovati = array();
$path=&#39;./&#39;; 
chdir($path); 
$cartella opendir($path); //../php/
// creiamo un ciclo che legga i contenuti e li metta nell&#39;array
while ($file readdir($cartella)) {
if (is_file($file)) {
$estensione estensione_file($file);
$pos substr($file03);
if ($estensione == "php" && $pos == "php") {
$file_trovati[] = $file;
}
}
}
// chiudiamo il tag php per iniziare a disegnare, in codice HTML la tabella che conterrà i nostri link
?>

<table class="elenco" width="95%" border="1" cellspacing="0" cellpadding="0">
      <tr>
        <th>Argomento</th>
      </tr>
<?php
//  rientriamo in PHP per continuare il lavoro
foreach ($file_trovati as $file) {
$titolo leggi_titolo($path $file);    // questo il richiamo alla funzione che legge nel tag <title>
if ($titolo != "") {
echo "<tr><td>";
echo "<a href=\"" $path $file "\">" $titolo "</a>";   // con questo la creazione del link al file
echo "</td></tr>\n";
}
}
?>

</table>

Questo codice produce  una cosa del genere:

Citazione
<a href="./php007.php">matrici</a>
<a href="./php005.php">Eliminare il carattere \ dai dati inviati da un form</a>
<a href="./php003.php">e-mail con una sola pagina</a>
ecc.

Le parti sono così state scelte:
./ ........................ viene preso dala variabile $path
php007.php .......... è il nome del file che rispetta i filtri imposti: .php (estensione), php (prefisso)
matrici .................. è la stringa letta nel tag <title>

Il codice non è di difficile comprensione, mi sembra di facile letturaa e comprensione, per cui potrei anche fermarmi qui

Per ora è tutto. Tornerò presto con nuovi argomenti.

Ciao    :sei mio: