ftruncate

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

ftruncateTronca un file alla lunghezza data

Descrizione

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

Prende il puntatore al file handle e tronca il file alla lunghezza indicata da size. Restituisce true in caso di successo, false in caso di fallimento.

Nota:

Nelle versioni di PHP precedenti alla 4.3.3, la funzione ftruncate() restituisce un integer di valore 1 se l'operazione riesce, anziché restituire boolean true.

See also fopen() and 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