Calcolare il numero di byte presenti in un file oltre i 2GB con PHP

di il
5 risposte

Calcolare il numero di byte presenti in un file oltre i 2GB con PHP

Ciao a tutti,
Qualcuno sa come calcolare il numero di byte presenti in un file oltre i 2GB con PHP?
Ho provato con la funzione filesize() ma se il file eccede i 2GB non funziona. Ho anche provato gli script presenti su php.net, in particolare ho testato il programma di Damien Dussouillez:
http://php.net/manual/en/function.filesize.php#12140
ma sempre senza alcun successo. Con PHP è proprio impossibile leggere la dimensione di un file che eccede i 2GB?!?!
A presto

5 Risposte

  • Re: Calcolare il numero di byte presenti in un file oltre i 2GB con PHP

    Quanto vale PHP_INT_MAX?
  • Re: Calcolare il numero di byte presenti in un file oltre i 2GB con PHP

    2147483647
  • Re: Calcolare il numero di byte presenti in un file oltre i 2GB con PHP

    Hai quindi due problemi, uno è che php non ha un modo semplice per fare quanto vuoi (spesso ci si appoggia a comandi Shell del sistema operativo) il secondo è che usi una versione a 32bit e non 64
  • Re: Calcolare il numero di byte presenti in un file oltre i 2GB con PHP

    Il mio OS è a 64 bit! Forse è XAMPP che è a 32 bit.
  • Re: Calcolare il numero di byte presenti in un file oltre i 2GB con PHP

    +m2+ ha scritto:


    Hai quindi due problemi, uno è che php non ha un modo semplice per fare quanto vuoi (spesso ci si appoggia a comandi Shell del sistema operativo) il secondo è che usi una versione a 32bit e non 64
    Ho capito il problema però perché se aggiungo un gestore per gli errori PHP va comunque in tilt?
    <?php
    /**
    * Return file size (even for file > 2 Gb)
    * For file size over PHP_INT_MAX (2 147 483 647), PHP filesize function loops from -PHP_INT_MAX to PHP_INT_MAX.
    *
    * @param string $path Path of the file
    * @return mixed File size or false if error
    */
    function realFileSize($path)
    {
        if (!file_exists($path))
            return false;
        $size = filesize($path);
        if (!($file = fopen($path, 'rb')))
            return false;
        if ($size >= 0)
        {//Check if it really is a small file (< 2 GB)
            if (fseek($file, 0, SEEK_END) === 0)
            {//It really is a small file
                fclose($file);
                return $size;
            }
        }
        //Quickly jump the first 2 GB with fseek. After that fseek is not working on 32 bit php (it uses int internally)
        $size = PHP_INT_MAX - 1;
        if (fseek($file, PHP_INT_MAX - 1) !== 0)
        {
            fclose($file);
            return false;
        }
        $length = 1024 * 1024;
        while (!feof($file))
        {//Read the file until end
            $read = fread($file, $length);
            $size = bcadd($size, $length);
        }
        $size = bcsub($size, $length);
        $size = bcadd($size, strlen($read));
        fclose($file);
        return $size;
    }
    function DimensioneFile($bytes) {
    	if ($bytes >= 1073741824) {$bytes = number_format($bytes / 1073741824, 2) . ' GB';}
    	elseif ($bytes >= 1048576) {$bytes = number_format($bytes / 1048576, 2) . ' MB';}
    	elseif ($bytes >= 1024) {$bytes = number_format($bytes / 1024, 2) . ' KB';}
    	elseif ($bytes > 1) {$bytes = $bytes . ' bytes';}
    	elseif ($bytes == 1) {$bytes = $bytes . ' byte';}
    	else {$bytes = '0 bytes od oltre 2GB';}
    	return $bytes;
    }
    function realFileSize2($file){
    	$byte_file = 0;
    	try {
    		$byte_file=realFileSize($file);
    	} catch(Exception $e) {
    		try {
    			$byte_file=filesize($file);
    		} catch(Exception $e) {
    			$byte_file = 0;
    		}
    	}
    	return $byte_file;
    }
    ?>
    <!doctype html>
    <html lang="it">
    <head><title>Ciao Mondo!</title></head>
    <body>
    	<h1>Ciao Mondo!</h1>
    	<p>Il file ha dimensione:
    	<?php echo realFileSize2("ggg.mkv");?>
    	</p> 
    	<h1>Ciao Mondo!</h1>
    	<p>Il file ha dimensione:
    	<?php echo DimensioneFile(realFileSize2("ggg.mkv"));?>
    	</p> 
    </body>
    </html>
    Ottengo una pagina bianca...
Devi accedere o registrarti per scrivere nel forum
5 risposte