我有:
<?php
$file=fopen(date("Y-m-d").".txt","r+") or exit("Unable to open file!");
if ($_POST["lastname"] <> "")
{
fwrite($file,$_POST["lastname"]."\n");
}
fclose($file);
?>
但它会覆盖文件的开头。如何插入?
答案 0 :(得分:25)
我不完全确定你的问题 - 你想写数据而不是覆盖现有文件的开头,或者将新数据写入现有文件的开头,保留现有内容它?
要插入文字而不覆盖文件的开头,您必须打开它才能追加(a+
rather than r+
)
$file=fopen(date("Y-m-d").".txt","a+") or exit("Unable to open file!");
if ($_POST["lastname"] <> "")
{
fwrite($file,$_POST["lastname"]."\n");
}
fclose($file);
如果您尝试写入文件的开头,则必须先读取文件内容(请参阅file_get_contents
),然后再写下新的字符串通过文件内容到输出文件。
$old_content = file_get_contents($file);
fwrite($file, $new_content."\n".$old_content);
上述方法适用于小文件,但尝试使用file_get_conents
读取大文件可能会遇到内存限制。在这种情况下,请考虑使用rewind($file)
,它将句柄的文件位置指示符设置为文件流的开头。
请注意,使用rewind()
时,请不要使用a
(或a+
)选项打开文件,如下所示:
如果您已在附加(“a”或“a +”)模式下打开文件,则无论文件位置如何,您写入文件的所有数据都将被追加。
答案 1 :(得分:1)
一个工作示例,用于在不覆盖的情况下插入文件流的中间,而无需将整个内容加载到变量/内存中:
function finsert($handle, $string, $bufferSize = 16384) {
$insertionPoint = ftell($handle);
// Create a temp file to stream into
$tempPath = tempnam(sys_get_temp_dir(), "file-chainer");
$lastPartHandle = fopen($tempPath, "w+");
// Read in everything from the insertion point and forward
while (!feof($handle)) {
fwrite($lastPartHandle, fread($handle, $bufferSize), $bufferSize);
}
// Rewind to the insertion point
fseek($handle, $insertionPoint);
// Rewind the temporary stream
rewind($lastPartHandle);
// Write back everything starting with the string to insert
fwrite($handle, $string);
while (!feof($lastPartHandle)) {
fwrite($handle, fread($lastPartHandle, $bufferSize), $bufferSize);
}
// Close the last part handle and delete it
fclose($lastPartHandle);
unlink($tempPath);
// Re-set pointer
fseek($handle, $insertionPoint + strlen($string));
}
$handle = fopen("file.txt", "w+");
fwrite($handle, "foobar");
rewind($handle);
finsert($handle, "baz");
// File stream is now: bazfoobar
答案 2 :(得分:0)
如果您想将文本放在文件的开头,则必须首先阅读文件内容,如:
<?php
$file=fopen(date("Y-m-d").".txt","r+") or exit("Unable to open file!");
if ($_POST["lastname"] <> "")
{
$existingText = file_get_contents($file);
fwrite($file, $existingText . $_POST["lastname"]."\n");
}
fclose($file);
?>
答案 3 :(得分:0)
你打开文件以便附加
<?php
$file=fopen(date("Y-m-d").".txt","a+") or exit("Unable to open file!");
if ($_POST["lastname"] <> "")
{
fwrite($file,$_POST["lastname"]."\n");
}
fclose($file);
?>