8

我有:

<?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);

?>

但它会覆盖文件的开头。我如何让它插入?

4

4 回答 4

29

我不完全确定您的问题-您是要写入数据而不是让它覆盖现有文件的开头,还是将新数据写入现有文件的开头,然后保留现有内容?

要插入文本而不覆盖文件的开头,您必须打开它以进行附加(a+而不是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()打开文件,如:aa+

如果您以追加(“a”或“a+”)模式打开文件,则无论文件位置如何,您写入文件的任何数据都将始终被追加。

于 2008-09-19T16:46:50.487 回答
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

可以在这里找到它的 Composer 库

于 2014-09-29T06:24:51.030 回答
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);

?>
于 2008-09-19T16:47:28.007 回答
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);
?>
于 2008-09-19T16:56:59.527 回答