ftruncate

(PHP 4, PHP 5)

ftruncateУрезает файл до указанной длинны

Описание

bool ftruncate ( resource $handle , int $size )

Принимает файловый указатель handle и урезает соответствующий файл до размера size.

Список параметров

handle

Файловый указатель.

Замечание:

handle должен быть открыт для записи.

size

Размер файла, до которого он будет обрезан.

Замечание:

Если size больше текущего размера файла, то файл будет дополнен null байтами.

Если size меньше текущего размера файла, то файл будет обрезан до этого размера.

Возвращаемые значения

Возвращает TRUE в случае успешного завершения или FALSE в случае возникновения ошибки.

Список изменений

Версия Описание
4.3.3 До этого релиза ftruncate() в случае успеха возвращал значение integer 1, вместо boolean TRUE.

Примеры

Пример #1 Пример обрезания файла

<?php
$filename 
'lorem_ipsum.txt';

$handle fopen($filename'r+');
ftruncate($handlerand(1filesize($filename)));
rewind($handle);
echo 
fread($handlefilesize($filename));
fclose($handle);
?>

Примечания

Замечание:

Файловый указатель не меняется.

Смотрите также

  • fopen() - Открывает файл или URL
  • fseek() - Устанавливает смещение в файловом указателе

Коментарии

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($dhfilesize($datei))."<br>";
echo 
"pointer after fread at: ".ftell($dh)."<br>";
ftruncate($dh0);
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($dh6);
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.
2008-01-06 00:49:44
http://php5.kiev.ua/manual/ru/function.ftruncate.html
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. ;)
2011-04-21 11:31:52
http://php5.kiev.ua/manual/ru/function.ftruncate.html
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($fp0);
fclose($fp);
?>

You can just do...

<?php
$fp 
fopen("/tmp/file.txt""w");
fclose($fp);
?>
2011-06-16 05:14:59
http://php5.kiev.ua/manual/ru/function.ftruncate.html
Автор:
You MUST use rewind() after ftruncate() to replace file content
2015-05-01 17:36:53
http://php5.kiev.ua/manual/ru/function.ftruncate.html

    Поддержать сайт на родительском проекте КГБ