2011-06-26 12 views
5

Estoy ejecutando un servidor NAS de Synology, y estoy tratando de usar PHP para obtener el tamaño de archivo de los archivos.
Estoy tratando de encontrar una función que calcule con éxito el tamaño del archivo de los archivos de más de 4Gb.PHP tamaño de archivo sobre 4Gb

filesize($file); sólo funciona para archivos < 2Gb
sprintf("%u", filesize($file)); sólo funciona para archivos < 4Gb

También probé otra función que he encontrado en el manual de php, pero no funciona correctamente.
Funciona aleatoriamente para ciertos tamaños de archivo pero no para otros.

function fsize($file) { 
    // filesize will only return the lower 32 bits of 
    // the file's size! Make it unsigned. 
    $fmod = filesize($file); 
    if ($fmod < 0) $fmod += 2.0 * (PHP_INT_MAX + 1); 

    // find the upper 32 bits 
    $i = 0; 

    $myfile = fopen($file, "r"); 

    // feof has undefined behaviour for big files. 
    // after we hit the eof with fseek, 
    // fread may not be able to detect the eof, 
    // but it also can't read bytes, so use it as an 
    // indicator. 
    while (strlen(fread($myfile, 1)) === 1) { 
    fseek($myfile, PHP_INT_MAX, SEEK_CUR); 
    $i++; 
    } 

    fclose($myfile); 

    // $i is a multiplier for PHP_INT_MAX byte blocks. 
    // return to the last multiple of 4, as filesize has modulo of 4 GB (lower 32 bits) 
    if ($i % 2 == 1) $i--; 

    // add the lower 32 bit to our PHP_INT_MAX multiplier 
    return ((float)($i) * (PHP_INT_MAX + 1)) + $fmod; 
} 

¿Alguna idea?

Respuesta

11

Usted está desbordando el entero de 32 bits de PHP. En * nix, esto le dará el tamaño del archivo como una cadena:

<?php $size = trim(shell_exec('stat -c %s '.escapeshellarg($filename))); ?> 
1

¿Qué hay de la ejecución de un comando shell como:

<?php 

echo shell_exec("du 'PATH_TO_FILE'"); 

?> 

donde vía_al_archivo es, obviamente, la ruta del archivo en relación con el script php

lo más probable hacer algunas expresiones regulares para obtener el tamaño de archivo como una independiente ya que devuelve una cadena como:

11777928 name_of_file.extention 
+0

Cuando intento simplemente eco que dice Advertencia: shell_exec(): No se puede ejecutar usando comillas inversas en modo seguro en /volume1/web/required/function.php en la línea 153. Intenté activar/desactivar el modo seguro – Richard

0

Aquí es una solución completa de lo que puede probar: https://stackoverflow.com/a/48363570/2592415

include_once 'class.os.php'; 
include_once 'function.filesize.32bit.php'; 

// Must be real path to file 
$file = "/home/username/some-folder/yourfile.zip"; 
echo get_filesize($file);