php中有一個(gè)系統(tǒng)自帶的計(jì)算文件大小的函數(shù),就是filesize(),但是這個(gè)函數(shù)是以字節(jié)為單位的,在一些情況下,我們需要很直觀的了解一個(gè)文件大小,就不僅僅需要字節(jié)B這個(gè)單位了,還需要KB,MB,GB,甚至更大TB,PB,所以我們需要自己寫一些函數(shù)來格式化filesize()的輸出結(jié)果。
比如碰到一個(gè)很大的文件有49957289167B,大家一看這么一長串的數(shù)字后面單位是字節(jié)B,還是不知道這個(gè)文件的大小是一個(gè)什么概念,我們把它轉(zhuǎn)換成GB為單位,就是46.53GB。用下面這些函數(shù)就可以完成這個(gè)工作:
- //轉(zhuǎn)換單位
- function setupSize($fileSize) {
- $size = sprintf("%u", $fileSize);
- if($size == 0) {
- return("0 Bytes");
- }
- $sizename = array(" Bytes", " KB", " MB", " GB", " TB", " PB", " EB", " ZB", " YB");
- return round($size/pow(1024, ($i = floor(log($size, 1024)))), 2) . $sizename[$i];
- }
- function byte_format($size, $dec=2){
- $a = array("B", "KB", "MB", "GB", "TB", "PB");
- $pos = 0;
- while ($size >= 1024) {
- $size /= 1024;
- $pos++;
- }
- return round($size,$dec)." ".$a[$pos];
- }
- /* Use : echo format_size(filesize("fichier"));
- Example result : 13,37 Ko */
- function format_size($o) {
- $size = array('Go' => 1073741824, 'Mo' => 1048576, 'Ko' => 1024, 'octets' => 1);
- foreach ($size as $k => $v)
- if ($o >= $v) {
- if ($k == 'octets')
- return round($o).' '.$k;
- return number_format($o / $v, 2, ',', ' ').' '.$k;
- }
- }
- /**
- * 文件大小格式化
- * @param integer $size 初始文件大小,單位為byte
- * @return array 格式化后的文件大小和單位數(shù)組,單位為byte、KB、MB、GB、TB
- */
- function file_size_format($size = 0, $dec = 2) {
- $unit = array("B", "KB", "MB", "GB", "TB", "PB");
- $pos = 0;
- while ($size >= 1024) {
- $size /= 1024;
- $pos++;
- }
- $result['size'] = round($size, $dec);
- $result['unit'] = $unit[$pos];
- return $result['size'].$result['unit'];
- }
- echo file_size_format(123456789);
- /**
- * 文件大小單位格式化
- * @param $bytes 文件實(shí)際大小,單位byte
- * @param $prec 轉(zhuǎn)換后精確度,默認(rèn)精確到小數(shù)點(diǎn)后兩位
- * @return 轉(zhuǎn)換后的大小+單位的字符串
- */
- function fsizeformat($bytes,$prec=2){
- $rank=0;
- $size=$bytes;
- $unit="B";
- while($size>1024){
- $size=$size/1024;
- $rank++;
- }
- $size=round($size,$prec);
- switch ($rank){
- case "1":
- $unit="KB";
- break;
- case "2":
- $unit="MB";
- break;
- case "3":
- $unit="GB";
- break;
- case "4":
- $unit="TB";
- break;
- default :
- }
- return $size." ".$unit;
- }
- /**
- * 容量格式化
- * @param String 文件名(文件路徑)
- * @return 如果文件存在返回格式化的字符串 如果錯(cuò)誤返回錯(cuò)誤信息 Unknown File
- */
- function sizeFormat ($fileName){
- //獲取文件的大小
- @ $filesize=filesize($fileName);
- //如果文件不存在返回錯(cuò)誤信息
- if(false==$filesize){
- return 'Unknown File';
- }
- //格式化文件容量信息
- if ($filesize >= 1073741824) $filesize = round($filesize / 1073741824 * 100) / 100 . ' GB';
- elseif ($filesize >= 1048576) $filesize = round($filesize / 1048576 * 100) / 100 . ' MB';
- elseif ($filesize >= 1024) $filesize = round($filesize / 1024 * 100) / 100 . ' KB';
- else $filesize = $filesize . ' Bytes';
- return $filesize;
- }
- //測試函數(shù)
- echo sizeFormat('config.inc.php');
- /**
- * 文件大小格式化
- * @param type $filesize
- */
- private function sizeCount($filesize)
- {
- if ($filesize >= 1073741824) {
- $filesize = round($filesize / 1073741824 * 100) / 100 . ' GB';
- }
- else if ($filesize >= 1048576) {
- $filesize = round($filesize / 1048576 * 100) / 100 . ' MB';
- }
- else if ($filesize >= 1024) {
- $filesize = round($filesize / 1024 * 100) / 100 . ' KB';
- }
- return $filesize;
- }
- //該函數(shù)最主要的是根據(jù)文件的字節(jié)數(shù),判斷應(yīng)當(dāng)選擇的統(tǒng)計(jì)單位,也就是說一個(gè)文件用某一單位比如MB,那么該文件肯定小于1GB,否則當(dāng)然要用GB作為單位了,而且文件要大于KB,不然的話得用更小的單位統(tǒng)計(jì)。該函數(shù)代碼如下
- //size() 統(tǒng)計(jì)文件大小
- function size($byte)
- {
- if($byte < 1024) {
- $unit="B";
- }
- else if($byte < 10240) {
- $byte=round_dp($byte/1024, 2);
- $unit="KB";
- }
- else if($byte < 102400) {
- $byte=round_dp($byte/1024, 2);
- $unit="KB";
- }
- else if($byte < 1048576) {
- $byte=round_dp($byte/1024, 2);
- $unit="KB";
- }
- else if ($byte < 10485760) {
- $byte=round_dp($byte/1048576, 2);
- $unit="MB";
- }
- else if ($byte < 104857600) {
- $byte=round_dp($byte/1048576,2);
- $unit="MB";
- }
- else if ($byte < 1073741824) {
- $byte=round_dp($byte/1048576, 2);
- $unit="MB";
- }
- else {
- $byte=round_dp($byte/1073741824, 2);
- $unit="GB";
- }
- $byte .= $unit;
- return $byte;
- } //Vevb.com
- //輔助函數(shù) round_up(),該函數(shù)用來取舍小數(shù)點(diǎn)位數(shù)的,四舍五入。
- function round_dp($num , $dp)
- {
- $sh = pow(10 , $dp);
- return (round($num*$sh)/$sh);
- }
這樣我們就能很好額統(tǒng)計(jì)任何一個(gè)文件的大小了,首先通過系統(tǒng)自帶的filesize()函數(shù)獲得文件的字節(jié)數(shù),再用上面的這些函數(shù)換算成適當(dāng)?shù)膯挝痪涂梢粤恕?/p>
新聞熱點(diǎn)
疑難解答