4

このコードを実行すると:

<?php
$handle = fopen('/tmp/lolwut', 'w') or die("Cannot open File");    
fwrite($handle, "1234567890");
fclose($handle);

print_r(filesize('/tmp/lolwut'));
?>

10ファイル内の正しい文字数である結果が得られます。

ただし、ファイル システム ブロックはこれよりもはるかに大きいため、ファイル サイズは 512 バイトまたは 1 KB 程度に「切り上げ」られると予想していました。なぜそうではないのですか?

4

1 に答える 1

8

「ファイル サイズ」と「ディスク上のファイル サイズ」を混同しないでください。PHP のfilesize関数は、後者ではなく前者を提供します。

そのように明示的に文書化されていませんが、filesize基本的には の観点から実装されてstatおり、Linuxstatではファイルサイズと「ディスク上のファイル サイズ」が区別されます

これらのシステム コールはすべてstat、次のフィールドを含む構造体を返します。

struct stat {
    // [...]
    off_t     st_size;    /* total size, in bytes */
    blksize_t st_blksize; /* blocksize for file system I/O */
    blkcnt_t  st_blocks;  /* number of 512B blocks allocated */
    // [...]
};

あなたが期待している値は ですst_blocks * st_blksizeが、「真の」ファイルサイズst_sizeは関係なく利用できます。

(これは、Windows でも同様のようです。)

于 2013-05-08T10:19:17.670 に答える