文字

filectime

(PHP 4, PHP 5, PHP 7)

filectime取得文件的 inode 修改时间

说明

int filectime ( string $filename )

取得文件的 inode 修改时间。

参数

filename

文件的路径。

返回值

返回文件上次 inode 被修改的时间, 或者在失败时返回 FALSE 。 时间以 Unix 时间戳的方式返回。

范例

Example #1 filectime() 例子

<?php

// 输出类似:  somefile.txt was last changed: December 29 2002 22:16:23.

$filename  'somefile.txt' ;
if (
file_exists ( $filename )) {
    echo 
" $filename  was last changed: "  date ( "F d Y H:i:s." filectime ( $filename ));
}

?>

错误/异常

失败时抛出 E_WARNING 警告。

注释

Note:

注意:在大多数 Unix 文件系统中,当一个文件的 inode 数据被改变时则该文件被认为是修改了。也就是说,当文件的权限,所有者,所有组或其它 inode 中的元数据被更新时。参见 filemtime() (这才是你想用于在 Web 页面中建立“最后更新时间”脚注的函数)和 fileatime()

Note:

注意某些 Unix 说明文本中把 ctime 说成是该文件建立的时间,这是错的。在大多数 Unix 文件系统中没有 Unix 文件的建立时间。

Note:

注意:不同文件系统对时间的判断方法可能是不相同的。

Note: 此函数的结果会被缓存。参见 clearstatcache() 以获得更多细节。

Tip

自 PHP 5.0.0 起, 此函数也用于某些 URL 包装器。请参见 支持的协议和封装协议以获得支持 stat() 系列函数功能的包装器列表。

参见

  • filemtime() - 取得文件修改时间

用户评论:

[#1] faketruth at yandex dot ru [2015-06-10 15:04:07]

If you need file creation time on Mac OS X:

<?php
if ($handle popen('stat -f %B ' escapeshellarg($filename), 'r')) {
    
$btime trim(fread($handle100));
    echo 
strftime("btime: %Y.%m.%d %H:%M:%S\n"$btime);
    
pclose($handle);
}
?>

[#2] coolkoon at gmail dot com [2011-01-23 14:42:57]

You should avoid feeding the function files without a path. This applies for filemtime() and possibly fileatime() as well. If you omit the path the command will fail with the warning "filectime(): stat failed for filename.php".

[#3] m dot rabe at directbox dot com [2010-01-06 18:07:37]

Under Windows you can use fileatime() instead of filectime().

[#4] soapergem at gmail dot com [2009-09-05 09:19:09]

Note that on Windows systems, filectime will show the file creation time, as there is no such thing as "change time" in Windows.

[#5] javi at live dot com [2009-02-03 02:15:13]

Filemtime seems to return the date of the EARLIEST modified file inside a folder, so this is a recursive function to return the date of the LAST (most recently) modified file inside a folder.

<?php

// Only take into account those files whose extensions you want to show.
$allowedExtensions = array(
  
'zip',
  
'rar',
  
'pdf',
  
'txt'
);

function 
filemtime_r($path)
{
    global 
$allowedExtensions;
    
    if (!
file_exists($path))
        return 
0;
    
    
$extension end(explode("."$path));     
    if (
is_file($path) && in_array($extension$allowedExtensions))
        return 
filemtime($path);
    
$ret 0;
    
     foreach (
glob($path."
  
function my_filesize($fp) {
    
$return false;
    if (
is_resource($fp)) {
      if (
PHP_INT_SIZE 8) {
        
// 32bit
        
if (=== fseek($fp0SEEK_END)) {
          
$return 0.0;
          
$step 0x7FFFFFFF;
          while (
$step 0) {
            if (
=== fseek($fp, - $stepSEEK_CUR)) {
              
$return += floatval($step);
            } else {
              
$step >>= 1;
            }
          }
        }
      } elseif (
=== fseek($fp0SEEK_END)) {
        
// 64bit
        
$return ftell($fp);
      }
    }
    return 
$return;
  }
?>

[#3] CertaiN [2014-05-05 07:52:57]

The simplest and most efficient implemention for getting remote filesize:

<?php
function remote_filesize($url) {
    static 
$regex '/^Content-Length: *+\K\d++$/im';
    if (!
$fp = @fopen($url'rb')) {
        return 
false;
    }
    if (
        isset(
$http_response_header) &&
        
preg_match($regeximplode("\n"$http_response_header), $matches)
    ) {
        return (int)
$matches[0];
    }
    return 
strlen(stream_get_contents($fp));
}
?>

[#4] linda dot collins at mailinator dot com [2013-10-13 02:08:08]

A fast implementation that determines actual file size of large files (>2GB) on 32-bit PHP:

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;
}

Input is an open file handle.  Return value is an integer for file sizes < 4GB, floating-point otherwise.

This starts out by skipping ~1GB at a time, reads a character in, repeats.  When it gets into the last GB, it halves the size whenever the read fails.  The last couple of bytes are just read in.

Some people might have concerns over this function because $pos will become a floating point number after exceeding integer limits and they know of floating point's tendencies to be inaccurate.  On most computers that correctly implement the IEEE floating point spec, $pos will be accurate out to around 9 *petabytes*.  Unless you are working with multi-petabyte files in PHP or the code is executing on strange hardware, this function is going to be more than sufficient.  Every part of this function has been carefully crafted to deal with 32-bit deficiencies.

[#5] cfv1000 at gmail dot com [2013-09-05 12:20:32]

To get the filesize of a directory use the built-in function disk_total_space

[#6] Arseny Mogilev [2013-08-16 10:51:03]

<?php
 
function FileSizeConvert($bytes)
{
    
$bytes floatval($bytes);
        
$arBytes = array(
            
=> array(
                
"UNIT" => "TB",
                
"VALUE" => pow(10244)
            ),
            
=> array(
                
"UNIT" => "GB",
                
"VALUE" => pow(10243)
            ),
            
=> array(
                
"UNIT" => "MB",
                
"VALUE" => pow(10242)
            ),
            
=> array(
                
"UNIT" => "KB",
                
"VALUE" => 1024
            
),
            
=> array(
                
"UNIT" => "B",
                
"VALUE" => 1
            
),
        );

    foreach(
$arBytes as $arItem)
    {
        if(
$bytes >= $arItem["VALUE"])
        {
            
$result $bytes $arItem["VALUE"];
            
$result str_replace(".""," strval(round($result2)))." ".$arItem["UNIT"];
            break;
        }
    }
    return 
$result;
}

?>

[#7] Anonymous [2013-07-24 22:57:26]

This functions returns the exact file size for file larger than 2 GB on 32 bit OS:

<?php
function file_get_size($file) {
    
//open file
    
$fh fopen($file"r"); 
    
//declare some variables
    
$size "0";
    
$char "";
    
//set file pointer to 0; I'm a little bit paranoid, you can remove this
    
fseek($fh0SEEK_SET);
    
//set multiplicator to zero
    
$count 0;
    while (
true) {
        
//jump 1 MB forward in file
        
fseek($fh1048576SEEK_CUR);
        
//check if we actually left the file
        
if (($char fgetc($fh)) !== false) {
            
//if not, go on
            
$count ++;
        } else {
            
//else jump back where we were before leaving and exit loop
            
fseek($fh, -1048576SEEK_CUR);
            break;
        }
    }
    
//we could make $count jumps, so the file is at least $count * 1.000001 MB large
    //1048577 because we jump 1 MB and fgetc goes 1 B forward too
    
$size bcmul("1048577"$count);
    
//now count the last few bytes; they're always less than 1048576 so it's quite fast
    
$fine 0;
    while(
false !== ($char fgetc($fh))) {
        
$fine ++;
    }
    
//and add them
    
$size bcadd($size$fine);
    
fclose($fh);
    return 
$size;
}
?>

[#8] lito at eordes dot com [2013-03-06 15:10:12]

A simple and improved function to get the folder size including subfolders:

<?php
function folderSize ($dir)
{
    
$size 0;
    
$contents glob(rtrim($dir'/').'
function dirSize($directory) {
    
$size 0;
    foreach(new 
RecursiveIteratorIterator(new RecursiveDirectoryIterator($directory)) as $file){
        
$size+=$file->getSize();
    }
    return 
$size;
}
?>

[#13] tmont [2009-07-25 02:05:22]

Here's the best way (that I've found) to get the size of a remote file. Note that HEAD requests don't get the actual body of the request, they just retrieve the headers. So making a HEAD request to a resource that is 100MB will take the same amount of time as a HEAD request to a resource that is 1KB.

<?php
$remoteFile 
'http://us.php.net/get/php-5.2.10.tar.bz2/from/this/mirror';
$ch curl_init($remoteFile);
curl_setopt($chCURLOPT_NOBODYtrue);
curl_setopt($chCURLOPT_RETURNTRANSFERtrue);
curl_setopt($chCURLOPT_HEADERtrue);
curl_setopt($chCURLOPT_FOLLOWLOCATIONtrue); //not necessary unless the file redirects (like the PHP example we're using here)
$data curl_exec($ch);
curl_close($ch);
if (
$data === false) {
  echo 
'cURL failed';
  exit;
}

$contentLength 'unknown';
$status 'unknown';
if (
preg_match('/^HTTP\/1\.[01] (\d\d\d)/'$data$matches)) {
  
$status = (int)$matches[1];
}
if (
preg_match('/Content-Length: (\d+)/'$data$matches)) {
  
$contentLength = (int)$matches[1];
}

echo 
'HTTP Status: ' $status "\n";
echo 
'Content-Length: ' $contentLength;
?>


Result:

HTTP Status: 302
Content-Length: 8808759

[#14] Svetoslav Marinov [2009-07-23 10:24:55]

This is an updated version of my previous filesize2bytes.
The return type now it's really an int.

<?php

function filesize2bytes($str) {
    
$bytes 0;

    
$bytes_array = array(
        
'B' => 1,
        
'KB' => 1024,
        
'MB' => 1024 1024,
        
'GB' => 1024 1024 1024,
        
'TB' => 1024 1024 1024 1024,
        
'PB' => 1024 1024 1024 1024 1024,
    );

    
$bytes floatval($str);

    if (
preg_match('#([KMGTP]?B)$#si'$str$matches) && !empty($bytes_array[$matches[1]])) {
        
$bytes *= $bytes_array[$matches[1]];
    }

    
$bytes intval(round($bytes2));

    return 
$bytes;
}
?>

[#15] Supermagnus [2008-06-30 03:38:11]

<?php
function getSizeFile($url) {
    if (
substr($url,0,4)=='http') {
        
$x array_change_key_case(get_headers($url1),CASE_LOWER);
        if ( 
strcasecmp($x[0], 'HTTP/1.1 200 OK') != ) { $x $x['content-length'][1]; }
        else { 
$x $x['content-length']; }
    }
    else { 
$x = @filesize($url); }

    return 
$x;
}
?>


In case of you have a redirection in the server (like Redirect Permanent in the .htaccess)

In this case we have for exemple:
    [content-length] => Array

        (

            [0] => 294          // Size requested file

            [1] => 357556     // Real Size redirected file

        )

[#16] jason dot whitehead dot tas at gmail dot com [2008-02-08 03:14:37]

I have created a handy function, using parts of code from kaspernj at gmail dot com and md2perpe at gmail dot com, which should get file sizes > 4GB on Windows, Linux and Mac  (at least).

<?php
    
function getSize($file) {
        
$size filesize($file);
        if (
$size 0)
            if (!(
strtoupper(substr(PHP_OS03)) == 'WIN'))
                
$size trim(`stat -c%s $file`);
            else{
                
$fsobj = new COM("Scripting.FileSystemObject");
                
$f $fsobj->GetFile($file);
                
$size $file->Size;
            }
        return 
$size;
    }
?>

[#17] webmaster at eclipse org [2007-11-07 07:30:27]

On 64-bit platforms, this seems quite reliable for getting the filesize of files > 4GB

<?php
$a 
fopen($filename'r');
fseek($a0SEEK_END);
$filesize ftell($a);
fclose($a);
?>

[#18] core58 at mail dot ru [2006-04-14 08:21:56]

some notes and modifications to previous post.
refering to RFC, when using HTTP/1.1 your request (either GET or POST or HEAD) must contain Host header string, opposite to HTTP/1.1 where Host ain't required. but there's no sure how your remote server would treat the request so you can add Host anyway (it won't be an error for HTTP/1.0).
host value _must_ be a host name (not CNAME and not IP address).

this function catches response, containing Location header and recursively sends HEAD request to host where we are moved until final response is met.
(you can experience such redirections often when downloading something from php scripts or some hash links that use apache mod_rewrite. most all of dowloading masters handle 302 redirects correctly, so this code does it too (running recursively thru 302 redirections).)

[$counter302] specify how much times your allow this function to jump if redirections are met. If initial limit (5 is default) expired -- it returns 0 (should be modified for your purposes whatever).0
ReadHeader() function is listed in previous post
(param description is placed there too).

<?php
function remote_filesize_thru$ipAddress$url$counter302 )
{
    
$socket fsockopen"10.233.225.2"8080 );
    if( !
$socket )
    {
        
// failed to open TCP socket connection
        // do something sensible here besides exit();
        
echo "<br>failed to open socket for [$ipAddress]";
        exit();
    }
                    
    
// just send HEAD request to server
    
$head "HEAD $url HTTP/1.0\r\nConnection: Close\r\n\r\n";
    
// you may use HTTP/1.1 instead, then your request head string _must_ contain "Host: " header
    
fwrite$socket$head );
        
    
// read the response header
    
$header ReadHeader$socket );
    if( !
$header )
    {
        
// handle empty response here the way you need...
        
Header"HTTP/1.1 404 Not Found" );
        exit();
    }
    
    
fclose$socket );
    
    
// check for "Location" header
    
$locationMarker "Location: ";
    
$pos strpos$header$locationMarker );
    if( 
$pos )
    {
            
$counter302--;
            if( 
$counter302 )
            {
                     
// redirect limit (5 by default) expired -- return some warning or do something sensible here
                    
echo "warning: too long redirection sequence";
                    return 
0;
            }

            
// Location is present -- we should determine target host and move there, like any downloading masters do...
            // no need to use regex here
            
$end strpos$header"\n"$pos );
            
$location trimsubstr$header$pos strlen$locationMarker ), $end $pos strlen$locationMarker ) ), "\\r\\n" );
             
             
// extract pure host (without "http://")
             
$host explode"/"$location );
             
$ipa gethostbyname$host[2] );
             
// move to Location
             
return remote_filesize_thru$ipa$location$counter302 );
    }
        
    
// try to acquire Content-Length within the response
    
$regex '/Content-Length:\s([0-9].+?)\s/';
    
$count preg_match($regex$header$matches);
                        
    
// if there was a Content-Length field, its value
    // will now be in $matches[1]
    
if( isset( $matches[1] ) )
          
$size $matches[1];
    else
          
$size 0;
    
    return 
$size;
}
?>

[#19] aidan at php dot net [2005-07-12 21:01:14]

This function quickly calculates the size of a directory:
http://aidanlister.com/repos/v/function.dirsize.php

You can convert filesizes to a human readable size using:
http://aidanlister.com/repos/v/function.size_readable.php

For a faster (unix only) implementation, see function.disk-total-space, note #34100
http://www.php.net/manual/en/function.disk-total-space.php#34100

Also of interest is this wikipedia article, discussing the difference between a kilobyte (1000) and a kibibyte (1024).
http://en.wikipedia.org/wiki/Bytes

上一篇: 下一篇: