Newsgroup: it.comp.www.php
Titolo: Readdir(), filemtime() ed altro. HELP!

Ciao a tutti,
come promesso :-), rieccomi!
Ho elaborato uno script che mi indichi il file più recente
di un sito, prendendo spunto dalla descrizione della funzione
readdir() descritta sul noto manuale.
Ho fatto diversi tentativi e sono sempre ad un passo dalla soluzione;
ma qualcosa va sempre storto.
C'è qualche anima pia che sa/può/vuole chiarirmi i dubbi
che ho inserito nei commenti del listato qui sotto?
Se sì, lo faccia! Per ringraziamento, può utilizzare lo script
(una volta messo a posto), se ritenuto utile.
Grazie.
-----
<?php
####################################
# aggiornamento.php3                                            #
# script per trovare la data di aggiornamento del sito  #
# vers. 0.4                                                            #
# autore: Piero Caruso                                            #
# data di aggiornamento: la trova lo script!!              #
####################################
// definizione delle directory coinvolte nella ricerca.
// questo script risiede nella directory "/d5" non
// contenuta nell'array $cart.
$cart = array("../", "../d1", "../d1/sd1", "../d1/sd2", "../d1/sd3",
"../d1/sd4", "../d2", "../d3", "../d4");
// sostituire i nomi delle directories sopra con quelli reali della
struttura del sito
// inizio loop di scansione directories
$n=0;
// contatore per l'array $elenco
for ($k=0;$k<sizeof($cart);$k++){// contatore delle directories da
controllare
 $cartella = $cart[$k];
echo $k."     ".$cartella."  inizio loop<br>";// check 1: OK!
  //chdir($cartella);// se attivata mi dà errore Dir not exists
 $handle = opendir($cartella);
 while (false !== ($file = readdir($handle))) {
// non capisco l'utilità dell'operatore "!==" (non identico/non dello
// stesso tipo) in un confronto con FALSE. Non basterebbe "!=",
// oppure "while ($file = readdir($handle))"?
echo $file."  ".filemtime($file)."<br>";// check 2:
// alcuni file NON hanno una data valida! Dipende da problemi
// della filemtime() o da problemi del/sul server? (PHP 4.0.5).
// Controllando con WSftp, gli stessi file risultano con la data esatta.
// Ho notato anche, che alcuni files hanno la data nel formato 'ggmm101',
// ed altri con il formato 'ggmm1', dove per 101 e 1 stanno per 2001.
// Anomalia di WSftp o del server?
// i file senza la data hanno indifferentemente i due formati.
  if ($file != "." && $file != ".."){// elimina parent directories
   if (is_file($file)){// elimina le subdirectories
// il controllo is_file() dà FALSE per quei files senza data
valida...giustamente!
     $elenco[$n] =  array( filemtime($file),$file, $cartella) ;
echo "in elenco ".$elenco[$n][0]."  ".$elenco[$n][1]."
".$elenco[$n][2]."<br>";// check 3:
// OK per i files con data valida
       $n++;
    }// if(is_file...
   }// if ($file...
 } // while...
 closedir($handle);
}// for...
rsort($elenco);// ordina per data decrescente
reset($elenco);// setta il puntatore al primo elemento (data più recente)
$file = $elenco[0][1];// nome del file più recente
$datagg = filemtime($file);// data in formato Unix
// display del file più recente
$data = date("j/n/Y", $datagg  );//data in formato "gg/mm/aaaa"
$ora = date("G:i:s", $datagg );// ora in formato "hh:mm:ss"
echo "file + recente:  ".$elenco[0][1]." ".$data." ".$ora.",<br>";
echo "che si trova in: ".$elenco[0][2];
// risultato: mi indica un file, che non è il più aggiornato che si trova
sulla
// directory ('/d4'), con la data e l'ora corretta del file. Il file più
aggiornato
// si trova invece sulla directory principale.
?>
--
Ciao, Piero.
http://www.qsl.net/ik2vtj
http://www.ardf.it
Togli  /  Remove
NONVOGLIOSPAM
dall'indirizzo  /  from address

 reset($elenco);// setta il puntatore al primo elemento (data più recente)
reset non mi sembra che ti serva qui.

 Perche' giustamente? Non mi sembra giusto...
Pensavo che, se la data č un elemento caratteristico di un file, non
trovandola, non lo considera un file valido.
Ho comunque trovato un mio errore:
quando eseguo $datagg=filemtime($elenco[0][1]) , fornisco il nome del file
piů aggiornato e che puň trovarsi in una qualuque cartella, ma la funzione
filemtime() va a cercare quel file sulla cartella corrente; se trova un file
con lo stesso nome, mi fornisce la sua data(non corrispondente a quella
memorizzata in $elenco[0][0]), altrimenti la data '1/1/1970 1:00:00'.
Corretto il problema fornendo a filemtime() il percorso completo.
Comunque trova spesso dei file senza data, per cui sballa il risultato.
Mi convinco sempre piů che sia un problema di server.
Grazie e ciao, Piero.


RISOLTO!
In modo non proprio elegante, forse c'è un modo migliore, ma funziona:
bastava mettere nell'array $cart :
"tutto_il_percorso_dalla_radice_del_server/nome_della_cartella_da_esaminare"
e fare una chdir tranne quando ci si trova nella cartella principale.
Spariscono anche gli errori sulle date di alcuni files!
Ciao, Piero.
