2014-06-16 5 views
1

파일 크기가 2GB를 초과하려하지만 64 또는 32 비트 버전과 상관없이 PHP 솔기가 문제가 발생합니다. 64 비트 OS에서 64 비트 프로세서로 실행되는 PHP 64 비트 버전에서는 filesize() 함수를 사용하여 잘못된 파일 크기를 반환합니다. 파일 크기가 변경되면 숫자가 변경되지만 파일 크기가 2GB를 초과하면 숫자가 변경됩니다 ... 실제 크기보다 작은 숫자는 이해할 수 있지만, 제로 또는 PHP는 32 비트 정수를 사용하지만, 내가 읽은대로, PHP는 64 비트가 파일 크기> 2기가바이트를 지원하도록되어있는 경우에도 음수 ...PHP x64가 여전히 잘못된 파일 크기를 반환합니다.

나는 또한 종료와 같은 ftell은 fseek과를 사용하여 시도했다 :

$a = fopen("c:\big.txt", 'r'); 
fseek($a,0,SEEK_END); 
$fs = ftell($a); 
fclose($a); 
echo $fs; 

하지만 그냥 0 ...

+0

이 페이지는 더 좋은 답변을 드릴 수 있습니다 : http://stackoverflow.com/questions/5501451/php-x86-how-to-get-filesize-of-2gb-file-without-external-program –

답변

0

filesize 기능을 사용하지 않는 이유는 무엇입니까?

echo filesize('c:\big.txt'); 

이 기능은 32 비트 시스템에서 제대로 작동하지 않을 수 있지만, 64 비트 시스템에 당신에게 정확한 크기를 제공한다 :

참고 : PHP의 정수 타입 서명 및 다양한 플랫폼 때문에 32 비트 정수를 사용하면 일부 파일 시스템 함수가 2GB보다 큰 파일에 예기치 않은 결과를 반환 할 수 있습니다.

+1

OP는 이미 그것을 시도했다. 그리고이 함수에 대한 문서의 주석은 "일부 파일 시스템 함수는 2GB보다 큰 파일에 예기치 않은 결과를 반환 할 수 있습니다."라고 말합니다. –

+1

파일 크기가 변경되었다고 언급했습니다. 다른 프로세스가 파일에 추가됩니까? 그렇다면'filesize'를 호출하기 전에'clearstatcache()'를 시도해보십시오 : http://www.php.net//manual/en/function.clearstatcache.php –

0

설명서에 실제로 "플랫폼에 문제가있을 수 있습니다. 오, 너무 좋지 않습니다."

이 의견은 도움이 될 수 있습니다 : http://us3.php.net/manual/en/function.filesize.php#113457. 그것은 당신이 시도한 것과 비슷하지만 SEEK_END가 작동하지 않는다고 가정하는 것 같습니다.

function RealFileSize($fp) 
{ 
    $pos = 0; 
    $size = 1073741824; 
    fseek($fp, 0, SEEK_SET); 
    while ($size > 1) 
    { 
     fseek($fp, $size, SEEK_CUR); 

     if (fgetc($fp) === false) 
     { 
      fseek($fp, -$size, SEEK_CUR); 
      $size = (int)($size/2); 
     } 
     else 
     { 
      fseek($fp, -1, SEEK_CUR); 
      $pos += $size; 
     } 
    } 

    while (fgetc($fp) !== false) $pos++; 

    return $pos; 
} 

면책 조항 :이 작업을 시도하지 않았습니다.

+0

그러나 재미있을 것 같아요. 그것이 30 초 제한에 의해 멈출 때까지. 나는 그것이 효과가 있었다고해도 사용하기에는 너무 오래 걸린다 고 생각하고있다. 나는 많은 양의 힘을 가할 것이므로 다소 효율적인 기능이 필요하다. 파일 ... –

+0

내가 생각할 수있는 유일한 "종류"의 신뢰할 수있는 방법은 파일 이름을 인수로 받아들이는 타사 콘솔 응용 프로그램을 만든 다음 PHP 스크립트를 통과 시키도록 설정하는 것입니다. PHP는 긴 정수를 처리 할 수 ​​있을까요? 간단한 if ($ size> = 9000000000)처럼? 게다가, 이제 스크립트는 하나의 플랫폼에 고정 될 것이고, 제 3자를 사용하는 것의 성능 저하를 고려조차하지 않는다. –