ftruncate

(PHP 4, PHP 5, PHP 7, PHP 8)

ftruncateファイルを指定した長さに丸める

説明

ftruncate(resource $stream, int $size): bool

ファイルポインタstreamを引数とし、 ファイルを指定した長さ、サイズに丸めます。

パラメータ

stream

ファイルポインタ。

注意:

stream は書き込みモードでオープンする必要があります。

size

丸める大きさ。

注意:

size がファイルのサイズより大きい場合は、 null バイトを用いてファイルを拡大します。

size がファイルのサイズより小さい場合は、 余分なデータは失われます。

戻り値

成功した場合に true を、失敗した場合に false を返します。

例1 ファイルの丸めの例

<?php
$filename
= 'lorem_ipsum.txt';

$handle = fopen($filename, 'r+');
ftruncate($handle, rand(1, filesize($filename)));
rewind($handle);
echo
fread($handle, filesize($filename));
fclose($handle);
?>

注意

注意:

ファイルポインタは変更 されません

参考

  • fopen() - ファイルまたは URL をオープンする
  • fseek() - ファイルポインタを移動する

add a note

User Contributed Notes 5 notes

up
43
emailfire at gmail dot com
14 years ago
If you want to empty a file of it's contents bare in mind that opening a file in w mode truncates the file automatically, so instead of doing...<?php$fp = fopen("/tmp/file.txt", "r+");ftruncate($fp, 0);fclose($fp);?>You can just do...<?php$fp = fopen("/tmp/file.txt", "w");fclose($fp);?>
up
20
Julien B.
10 years ago
You MUST use rewind() after ftruncate() to replace file content
up
9
rc at opelgt dot org
17 years ago
Writing after ftruncateI didnt expect that I can write in the middle of nowhere. I thought that I would write at the beginning of the file but the first 4 bytes were filled automatically with NULLs followed by "56":<?php$str1  = 1234;$str2  =   56;$datei = "test.txt";$dh = fopen($datei,"w");fwrite($dh, $str1);fclose($dh);$dh = fopen ($datei,"r+");echo "content: ".fread($dh, filesize($datei))."<br>";echo "pointer after fread at: ".ftell($dh)."<br>";ftruncate($dh, 0);echo "pointer after truncate at: ".ftell($dh)."<br>";fwrite($dh, $str2);echo "pointer after fwrite at: ".ftell($dh)."<br>";rewind($dh);echo "pointer after rewind at: ".ftell($dh)."<br>";$str = fread($dh, 6);echo "content: $str<br>in ASCII: ";for($i = 0; $i < 6; $i++) echo ord($str{$i})."-";fclose($dh);/*   OUTPUT:   content: 1234   pointer after fread at: 4   pointer after truncate at: 4   pointer after fwrite at: 6   pointer after rewind at: 0   content: 56   in ASCII: 0-0-0-0-53-54*/?>So not only ftruncate is filling an empty file up with NULLs as in the note before. Fread is filling leading space with NULLs too.
up
2
Masoud
4 years ago
The problem that rc at opelgt dot org mentioned seems completely logical.When pointer is at offset 4 and you truncate file, the pointer is still at offset 4.So when you write(), the first 4 bytes are filled with null byte by Operating System - There is nothing wrong by PHP. And it's filled with null byte, because there is data on disk and that needs to be cleared with zero bits.Even though this is a Operating System's gotcha, to avoid data corruption, PHP Docs should mention it clearly. Also it would be nice if PHP automatically sets the pointer's offset to SEEK_END  after truncating to an smaller size to fool-proof it.
up
1
eurosat7 at yahoo dot de
14 years ago
If you want to ftruncate but keep the end:<?php    function ftruncatestart($filename,$maxfilesize){        $size=filesize($filename);        if ($size<$maxfilesize*1.0) return;        $maxfilesize=$maxfilesize*0.5; //we don't want to do it too often...        $fh=fopen($filename,"r+");        $start=ftell($fh);        fseek($fh,-$maxfilesize,SEEK_END);        $drop=fgets($fh);        $offset=ftell($fh);        for ($x=0;$x<$maxfilesize;$x++){            fseek($fh,$x+$offset);            $c=fgetc($fh);            fseek($fh,$x);            fwrite($fh,$c);        }        ftruncate($fh,$maxfilesize-strlen($drop));        fclose($fh);    }?>It will not just cut it but search for a newline so you avoid corrupting your csv or logfiles. But I don't know if you will stress the reading head of your drive. ;)
To Top