Mangiare Senza Glutine disponibile su App Store

Per altre informazioni scrivi a fabriziocaldarelli@negusweb.it

Scansione files di una cartella e ordinamento per data

Da Programmazione Software.

Descrizione

Eseguire la scansione dei files di una cartella in PHP non è complicato e le istruzioni per scrivere codice compatibile sia con la versione 4 e la 5 è rapido, infatti:

      /*
                 Carica tutti i files presenti nella cartella corrente
      */
 
     // Inizializza il vettore che conterrà tutti i files
     $arrFiles = array();
 
     // Specifica la cartella di cui fare la scansione
     $dir = "./";        
 
     // Apre la cartella
     $dh = opendir($dir);
 
      // Legge tutti i files presenti nella cartella
     while ($filename = readdir($dh))
     {
          // Mi accerto che il file sia specificatamente un file ( e non una cartella )
          if (is_file($dir."/".$filename))
               $arrFiles[] = $filename;        // Aggiungo il file all'array
     }

Tra tutti gli ordinamenti possibili sui files, quello che potrebbe essere più interessante, sia come metodologia di risoluzione che come applicazione, è quello per data. Per risolvere il problema è possibile associare ad ogni voce dell'array una chiave costituita dal tempo di creazione del file e poi applicare la funzione ksort o krsort per applicare l'ordinamento su questo nuovo array. In codice e soprattutto in grassetto quello che cambia rispetto al codice precedente:

      /*
                 Carica tutti i files presenti nella cartella corrente
      */
 
     // Inizializza il vettore che conterrà tutti i files
     $arrFiles = array();
 
     // Specifica la cartella di cui fare la scansione
     $dir = "./";        
 
     // Apre la cartella
     $dh = opendir($dir);
 
      // Legge tutti i files presenti nella cartella
     while ($filename = readdir($dh))
     {
          // Mi accerto che il file sia specificatamente un file ( e non una cartella )
          if (is_file($dir."/".$filename))
               $arrFiles[filemtime($dir."/".$filename)] = $filename;        // Aggiungo il file all'array
     }
     krsort($arrFiles);     // per l'ordinamento decrescente; ksort() per l'ordinamento crescente

Da notare una possibile e grave problematica legata a questo approccio, cioè che se due files hanno lo stesso Unix timestamp allora il primo viene sovrascritto, ma su una cartella con upload distanti e poco frequenti è un'occasione remota, se non impossibile. Per ovviare al problema, basta fare una controllo sull'eventuale esistenza della chiave (array_key_exists()) prima dell'aggiunta. L'eventuale presenza della chiave può essere risolto aggiungendo un valore piccolo (1, per esempio) al valore rilasciato da filemtime (un secondo in più nella maggior parte delle applicazioni non cambia nulla), fino a quando la chiave risulta inesistente nell'archivio. Il codice completo e corretto è il seguente:

      /*
                 Carica tutti i files presenti nella cartella corrente
      */
 
     // Inizializza il vettore che conterrà tutti i files
     $arrFiles = array();
 
     // Specifica la cartella di cui fare la scansione
     $dir = "./";        
 
     // Apre la cartella
     $dh = opendir($dir);
 
      // Legge tutti i files presenti nella cartella
     while ($filename = readdir($dh))
     {
          // Mi accerto che il file sia specificatamente un file ( e non una cartella )
          if (is_file($dir."/".$filename))
          {
               $tempo = filemtime($dir."/".$filename);
               while (array_key_exists($tempo, $arrFiles)) $tempo++;
               $arrFiles[$tempo] = $filename;        // Aggiungo il file all'array
          }
     }
     krsort($arrFiles);     // per l'ordinamento decrescente; ksort() per l'ordinamento crescente

Scrivetemi per segnalarmi errori, malfunzionamenti, bug o miglioramenti.