fwrite写入时不会删除原有内容,从文件开头开始写入。

4

我正在使用PHP和fwrite代码,但是我希望每次写入的位置都从文件的开头开始,而不会擦除其内容。我正在使用这段代码,但它是写在文件的末尾。

$fr = fopen("aaaa.txt", "a");
fwrite($fr, "text");
fclose($fr);
9个回答

3

所以你想在文件开头写入新数据,但是要保留原有内容?你需要先获取现有的内容,然后在覆盖新数据后将其追加回文件中。

$file = 'aaaa.txt';
$oldContents = file_get_contents($file);
$fr = fopen($file, 'w');
fwrite($fr, "text");
fwrite($fr, $oldContents);
fclose($fr);

如果你想避免在PHP脚本中将原始文件的内容加载到内存中,可以尝试先写入临时文件,使用循环缓冲区或系统调用将原始文件的内容附加到临时文件中,然后删除原始文件并重命名临时文件。

1

来自 PHP 网站:

注意:

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

我建议像这样(来自 php.net 网站):

$handle = fopen('output.txt', 'r+');

fwrite($handle, 'Really long sentence.');
rewind($handle);
fwrite($handle, 'Foo');
rewind($handle);

echo fread($handle, filesize('output.txt'));

fclose($handle);

感谢注意到关于附加的一点。我之前只是假定fseek总是有效的。 - gereeter
这将从文件开头覆盖其内容。提问者希望保留其内容。你复制的示例甚至标题为“rewind() 覆盖示例”。 - Wiseguy
我完全误读了问题。我相信唯一的解决方案是使用fread和fwrite循环读取文件并将其写回以节省大文件的内存。 - Fabrizio
我不会说这是唯一的解决方案,但在 PHP 中可能是唯一的方法。然而,这是一种非常棘手的方法,因为你必须维护多个缓冲区才能避免破坏现有数据。 - Wiseguy
嗯...是的,我们在谈论PHP,以及几个缓冲区,比如说...2个?一个用于旧文件指针(之前已经重命名了它),另一个用于新文件(已经有新内容作为第一个fwrite)。如果文件同时有多个写入,这种方法非常糟糕,可能会出现混乱...但在这种情况下,可以创建一个信号量:while(old_file_exists){usleep(1000);} - Fabrizio
好的,我现在明白了。使用临时文件是可以的。我原以为你的意思是,在不使用临时文件的情况下,从同一文件的前面写入,同时从同一文件的更远处读取。这就是为什么我说它非常棘手的原因。 - Wiseguy

0
$file = 'aaaa.txt';
$tmp = file_get_contents($file);
$tmp = 'text'.$tmp;
$tmp = file_put_contents($file, $tmp);
echo ($tmp != false)? 'OK': '!OK';

如果这是一个大文件怎么办?你想把它全部放在内存中吗? - Viper_Sb

0

这应该可以工作:

$file="name.extension";
$current = file_get_contents($file);
$user = $_POST["username"];
$pass = $_POST["password"];
file_put_contents($file,$current . "Whatever you want to add here"

这个程序会找到当前的内容并在每次运行代码时将其复制/粘贴回来(为了让答案尽可能简单易懂,我尝试使它尽可能简单,以防其他答案过于复杂)


0
请使用以下代码:
$file = 'aaaa.txt';
$oldContents = file_get_contents($file);
$fr = fopen($file, 'w');
$newmsg="text".$oldContents;
fwrite($fr, $oldContents);
fclose($fr);

0

使用file_get_contents预取旧内容,并在写入新内容后追加它是一种方法。 但是,如果文件正在动态写入,并且在此过程中您需要返回到文件开头并添加一些文本,则可以按照以下方式操作:

$handle = fopen($FILE_PATH, 'w+');
fwrite($handle, "I am writing to a new empty file 
                and now I need to add Hello World to the beginning");

要在前面添加“Hello World”,请执行以下操作:

$oldText = '';
fseek($handle, 0);
while (!feof($handle)) {
   $oldText .= fgets($handle);
}
fseek($handle, 0);
fwrite($handle, "Hello World! ");
fwrite($handle, $oldText);

fclose($handle);

结果将是:

你好,世界!我正在写入一个新的空文件,现在我需要在开头添加“Hello World”

提醒和像Fabrizio已经指出的:

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


0
  1. 以w+模式打开文件,而不是a+模式。
  2. 获取要添加的文本长度($chunkLength)
  3. 将文件光标设置为文件开头
  4. 从文件中读取$chunkLength字节
  5. 将光标返回到$chunkLength * $i处;
  6. 写入$prepend
  7. 将$prepend设置为步骤4中的值
  8. 在EOF时执行以下步骤

    $handler = fopen('1.txt', 'w+');//1
    rewind($handler);//3
    $prepend = "我想在这个文件的开头添加这段文字";
    $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);
    

0

首先以c+模式打开文件,如果文件不存在则创建新文件,并将指针指向文件开头。要获取旧内容,请使用file_get_contents并检查文件是否存在。

$fh = fopen($file_path, 'c+'); 

if (file_exists($file_path)) {   
    $oldContents = file_get_contents($file_path);  
    fwrite($fh,"New Content" );  
    fwrite($fh, $oldContents);   
} else {   
    fwrite($fh,"New Content");   
}   

fclose($fh);

-2
使用 fseek() 函数来设置文件中的位置。
$fr = fopen("aaaa.txt", "r+");
fseek($fr, 0); // this line will set the position to the beginning of the file
fwrite($fr, "text");
fclose($fr);

正如Fabrizio的回答中所指出的那样,以“a”模式打开文件将会在文件末尾追加内容,而不管当前指针的位置。 - Wiseguy
这将覆盖文件内容。 - Bassel Mourjan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接