2011-10-03 10 views
15

Io uso la funzione PHP filemtime per ottenere l'ultima modifica con PHP 5.3. Questa funzione funziona molto bene, ma sembra che abbia qualche problema quando i nomi dei file hanno caratteri speciali (ad esempio dieresi).filemtime() [function.filemtime]: stat fallita per nomi di file con dieresi

Se l'eseguo su un nome di file con dieresi

$stat = filemtime('C:/pictures/München.JPG'); 

tanto sono l'output:

Warning: filemtime() [function.filemtime]: stat failed for C:/pictures/München.JPG 

Se rinominare il file da "München.JPG" a "Muenchen.JPG" e fai di nuovo la stessa cosa:

$stat = filemtime('C:/pictures/Muenchen.JPG'); 

tutto funziona bene!

mio file PHP viene salvato come UTF-8 senza BOM e ho anche provato:

clearstatcache(); 
$stat = filemtime(utf8_encode('C:/pictures/München.JPG')); 

, ma non ha aiutato.

+0

Avete lo stesso set di caratteri nel file come nel sistema operativo? –

+2

Dato che è un sistema Windows, è quasi certamente NTFS, che è utf-16. –

+0

Al momento utilizzo questo script su un computer Windows 7 (con un disco rigido formattato NTFS) ma in seguito voglio usarlo su un server Ubuntu. –

risposta

12

Con il seguente frammento di codice ho scoperto che la codifica del file in Windows 7 è "ISO-8859-1":

$scandir = scandir('.') 
$encoding = mb_detect_encoding($scandir[0], 'ISO-8859-1, UTF-8, ASCII'); 
echo $encoding; 

Ho letto che utf8_decode converte una stringa UTF-8 a iso- 8859-1 così ho finito con questo piccolo codice che funziona per il mio progetto:

$file = 'C:/pictures/München.JPG'; 
$lastModified = @filemtime($file); 
if($lastModified == NULL) 
    $lastModified = filemtime(utf8_decode($file)); 
echo $lastModified; 

Grazie a tutti coloro che hanno presentato un commento. Mi hai guidato nella giusta direzione. :-)

1

provare questo

$dir = 'uploads/'; 

     if (is_dir($dir)) { if ($dh = opendir($dir)) { 

      while (($file = readdir($dh)) !== false) {     
       clearstatcache(); 
       if(is_file($dir."/".$file)) {      
        echo $file; 
        echo " - ";      
        echo "Last modified: " . date ("F d, Y H:i:s.", filemtime(utf8_decode($dir."/".$file))); 
        echo "<br>"; 
       }     
      }    

      echo "<br>"; 
      closedir($dh); 
     } 
    }