ftruncate

(PHP 4, PHP 5)

ftruncateTrunca un archivo a una longitud dada

Descripción

bool ftruncate ( resource $handle , int $size )

Toma el puntero al archivo, handle, y trunca el archivo a la longitud size.

Parámetros

handle

El puntero al archivo.

Nota:

handle puede ser abierto para escritura.

size

El tamaño a truncar.

Nota:

Si size es mayor que el del archivo, éste se extiende con bytes null.

Si size es menor que el del archivo, éste será truncado a ese tamaño.

Valores devueltos

Devuelve TRUE en caso de éxito o FALSE en caso de error.

Ejemplos

Ejemplo #1 Ejemplo de truncar un archivo

<?php
$nombre_archivo 
'lorem_ipsum.txt';

$gestor fopen($nombre_archivo'r+');
ftruncate($gestorrand(1filesize($nombre_archivo)));
rewind($gestor);
echo 
fread($gestorfilesize($nombre_archivo));
fclose($gestor);
?>

Notas

Nota:

El puntero al archivo no es cambiado.

Ver también

  • fopen() - Abre un fichero o una URL
  • fseek() - Busca sobre un puntero a un fichero

add a note add a note

User Contributed Notes 3 notes

up
3
rc at opelgt dot org
6 years ago
Writing after ftruncate

I 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
emailfire at gmail dot com
3 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
-1
eurosat7 at yahoo dot de
3 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