Je crée ce programme et j'essaie de savoir comment écrire des données au début d'un fichier plutôt qu'à la fin. "a"/append n'écrit que jusqu'à la fin, comment puis-je l'écrire au début? Parce que "r +" le fait mais écrase les données précédentes.
$datab = fopen('database.txt', "r+");
Voici tout mon dossier:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Facebook v0.1</title>
<style type="text/css">
#bod{
margin:0 auto;
width:800px;
border:solid 2px black;
}
</style>
</head>
<body>
<div id="bod">
<?php
$fname = $_REQUEST['fname'];
$lname = $_REQUEST['lname'];
$comment = $_REQUEST['comment'];
$datab = $_REQUEST['datab'];
$gfile = $_REQUEST['gfile'];
print <<<form
<table border="2" style="margin:0 auto;">
<td>
<form method="post" action="">
First Name :
<input type ="text"
name="fname"
value="">
<br>
Last Name :
<input type ="text"
name="lname"
value="">
<br>
Comment :
<input type ="text"
name="comment"
value="">
<br>
<input type ="submit" value="Submit">
</form>
</td>
</table>
form;
if((!empty($fname)) && (!empty($lname)) && (!empty($comment))){
$form = <<<come
<table border='2' width='300px' style="margin:0 auto;">
<tr>
<td>
<span style="color:blue; font-weight:bold;">
$fname $lname :
</span>
$comment
</td>
</tr>
</table>
come;
$datab = fopen('database.txt', "r+");
fputs($datab, $form);
fclose($datab);
}else if((empty($fname)) && (empty($lname)) && (empty($comment))){
print" please input data";
} // end table
$datab = fopen('database.txt', "r");
while (!feof($datab)){
$gfile = fgets($datab);
print "$gfile";
}// end of while
?>
</div>
</body>
</html>
Le rapide et sale:
<?php
$file_data = "Stuff you want to add\n";
$file_data .= file_get_contents('database.txt');
file_put_contents('database.txt', $file_data);
?>
Si vous ne voulez pas charger tout le contenu du fichier dans une variable, vous pouvez utiliser la fonctionnalité Streams de PHP:
function prepend($string, $orig_filename) {
$context = stream_context_create();
$orig_file = fopen($orig_filename, 'r', 1, $context);
$temp_filename = tempnam(sys_get_temp_dir(), 'php_prepend_');
file_put_contents($temp_filename, $string);
file_put_contents($temp_filename, $orig_file, FILE_APPEND);
fclose($orig_file);
unlink($orig_filename);
rename($temp_filename, $orig_filename);
}
Cela écrit la chaîne que vous souhaitez ajouter au début dans un fichier temporaire, puis le contenu du fichier original à la fin du fichier temporaire (en utilisant des flux au lieu de copier le fichier entier dans une variable), puis il est supprimé. le fichier d'origine et renomme le fichier temporaire pour le remplacer.
Remarque: Ce code était à l'origine basé sur un article de blog maintenant disparu de Chao Xu. Le code a depuis divergé, mais le message original peut être consulté dans la Wayback Machine .
Je pense que vous pouvez d'abord lire le contenu du fichier et le conserver dans une variable temporaire. Insérez maintenant les nouvelles données au début du fichier avant d'ajouter également le contenu de la variable temporaire.
$ file = file_get_contents ($ filename); $ content = 'Votre contenu'. $ file; file_put_contents ($ content);
faire ces étapes, tandis que EOF
$handler = fopen('1.txt', 'w+');//1
rewind($handler);//3
$prepend = "I would like to add this text to the beginning of this file";
$chunkLength = strlen($prepend);//2
$i = 0;
do{
$readData = fread($handler, $chunkLength);//4
fseek($handler, $i * $chunkLength);//5
fwrite($handler, $prepend);//6
$prepend = $readData;//7
$i++;
}while ($readData);//8
fclose($handler);
Vous pouvez utiliser le code suivant pour ajouter du texte au début et à la fin du fichier.
$myFile = "test.csv";<br>
$context = stream_context_create();<br>
$fp = fopen($myFile, 'r', 1, $context);<br>
$tmpname = md5("kumar");<br>
//this will append text at the beginning of the file<br><br>
file_put_contents($tmpname, "kumar");<br>
file_put_contents($tmpname, $fp, FILE_APPEND);<br>
fclose($fp);<br>
unlink($myFile);<br>
rename($tmpname, $myFile);<br><br>
//this will append text at the end of the file<br>
file_put_contents($myFile, "ajay", FILE_APPEND);
Il n'y a aucun moyen d'écrire au début d'un fichier comme vous le pensez. Ceci est dû au fait que les systèmes d'exploitation et les disques durs voient le fichier. Il a un début fixe et une fin en expansion. Si vous voulez ajouter quelque chose au milieu ou commencer, il faut un peu de glissement. S'il s'agit d'un petit fichier, il suffit de tout lire, de manipuler et d'écrire. Mais sinon, et si vous ajoutez toujours au début, inversez simplement l'ordre des lignes, considérez la fin comme un début ...
Vous pouvez utiliser fseek
pour changer le pointeur dans la note.
Il est à noter que si vous utilisez fwrite
, le contenu actuel sera effacé. Donc, fondamentalement, vous devez lire le fichier entier, utiliser fseek
, écrire votre nouveau contenu, écrire les anciennes données du fichier.
$file_data = file_get_contents('database.txt')
$fp = fopen('database.txt', 'a');
fseek($fp,0);
fwrite($fp, 'new content');
fwrite($fp, $file_data);
fclose($fp);
Si votre fichier est vraiment énorme et que vous ne voulez pas utiliser trop de mémoire, vous voudrez peut-être avoir une approche à deux fichiers comme
$fp_source = fopen('database.txt', 'r');
$fp_dest = fopen('database_temp.txt', 'w'); // better to generate a real temp filename
fwrite($fp_dest, 'new content');
while (!feof($fp_source)) {
$contents .= fread($fp_source, 8192);
fwrite($fp_dest, $contents);
}
fclose($fp_source);
fclose($fp_dest);
unlink('database.txt');
rename('database_temp.txt','database.txt');
La solution de Ben semble être plus simple à mon avis.
Un dernier point: je ne sais pas ce que vous stockez dans database.txt
mais vous pourriez faire la même chose plus facilement en utilisant un serveur de base de données.
Ce code mémorise les données depuis le début du fichier pour éviter qu'elles ne soient écrasées. Ensuite, il réécrit toutes les données existantes dans le fichier, morceau par morceau.
$data = "new stuff to insert at the beggining of the file";
$buffer_size = 10000;
$f = fopen("database.txt", "r+");
$old_data_size = strlen($data);
$old_data = fread($f, $old_data_size);
while($old_data_size > 0) {
fseek($f, SEEK_CUR, -$old_data_size);
fwrite($f, $data);
$data = $old_data;
$old_data = fread($f, $buffer_size);
$old_data_size = strlen($data);
}
fclose($f);
file_get_contents()
et file_put_contents()
utilisent plus de mémoire que les fonctions fopen()
, fwrite()
et fclose()
:
$fh = fopen($filename, 'a') or die("can't open file");
fwrite($fh, $fileNewContent);
fclose($fh);