Simple script which will delete spaces from end of php files (suitable in big sites, when you are including many files before sending headers and without output buffering):
<?php
function mapfiles($func,$filename,$level=0) {
if(is_dir($filename)) {
if($level>30) return; //limit recurence in case of looped dirs
$handle=opendir($filename);
while(($dirname=readdir($handle))!==false) {
if($dirname=='.'||$dirname=='..') continue;
mapfiles($func,$filename.'/'.$dirname,$level+1);
}
closedir($handle);
} else {
$func($filename);
}
}
function scanfile($filename) {
if(substr($filename,-4)!=".php") return;
$ff=fopen($filename,"r+");
fseek($ff, -10, SEEK_END);
$str=fread($ff,12);
$matches=array();
if(preg_match('/\?>(\s+)$/',$str,$matches)) {
$fsize=filesize($filename);
ftruncate($ff, $fsize-strlen($matches[1]));
}
fclose($ff);
}
mapfiles("scanfile",".");
?>
ftruncate
(PHP 4, PHP 5)
ftruncate — Tronque un fichier
Description
bool ftruncate
( resource $handle
, int $size
)
Prend le pointeur de fichier handle et le tronque à la taille de size.
Liste de paramètres
- handle
-
Le pointeur de fichier.
Note:
Le pointeur handle doit avoir été ouvert en écriture.
- size
-
La taille que l'on doit enlever.
Note:
Si size est plus grand que la taille du fichier, ce dernier sera étendu par des octets nuls.
Si size est plus petit que la taille du fichier, le reste des données sera perdu.
Valeurs de retour
Cette fonction retourne TRUE en cas de succès ou FALSE si une erreur survient.
Historique
| Version | Description |
|---|---|
| PHP 4.3.3 | Avant PHP 4.3.3, ftruncate() retournait un entier de valeur 1, en cas de succès, au lieu de la valeur boolean TRUE. |
Exemples
Exemple #1 Exemple avec ftruncate()
<?php
$filename = 'lorem_ipsum.txt';
$handle = fopen($filename, 'r+');
ftruncate($handle, rand(1, filesize($filename)));
rewind($handle);
echo fread($handle, filesize($filename));
fclose($handle);
?>
Notes
Note:
Le pointeur de fichier n'est pas modifié.
ftruncate
yetihehe at yetihehe dot com
22-Apr-2010 12:12
22-Apr-2010 12:12
rc at opelgt dot org
06-Jan-2008 07:49
06-Jan-2008 07:49
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.
mike at mikeleigh dot com
04-Jan-2007 09:30
04-Jan-2007 09:30
I have produced a number of tests below which walk through my findings of the ftruncate function. For the impatient among you ftruncate can be used to increase the size of the file and will fill the rest of the file with CHR 0 or ASCII NULL. It can be used as a very convenient way of making a 1Mb file for instance.
Test 1
<?php
/*
Test 1: Write "some text" to a file.
Result: The text "some text" should be present in test_1.txt
*/
$fp = fopen('test_1.txt', 'w+');
fwrite($fp, 'some text');
?>
The first test is only here to make sure that a file can be written with some text.
Test 2
<?php
/*
Test 2: Write "some text" to a file and ftruncate the file to 4 bytes.
Result: The text "some" should be present in test_2.txt as the file will have been truncated to 4 bytes.
*/
$fp = fopen('test_2.txt', 'w+');
fwrite($fp, 'some text');
ftruncate($fp, 4);
?>
As expected the file has been truncated to 4 bytes.
Test 3
<?php
/*
Test 3: Write "some text" to a file and ftruncate the file to 40 bytes.
Result: The text "some text" should be present in test_3.txt as the file will have been truncated to 40 bytes.
*/
$fp = fopen('test_3.txt', 'w+');
fwrite($fp, 'some text');
ftruncate($fp, 40);
?>
Interestingly the file has increased from 9 bytes to 40 bytes. The remaining 31 bytes of the file are ASCII code 0 or NULL though.
Further notes can be found here http://mikeleigh.com/links/ftruncate
