我如何预先开始文件?
在PHP中,如果你写入一个文件,它将写入现有文件的结尾。
我们如何在文件的开头预先写入一个文件?
我已经尝试rewind($handle)
function,但似乎覆盖,如果当前的内容比现有的大。
有任何想法吗?
file_get_contents解决scheme对于大文件是低效的。 这个解决scheme可能需要更长的时间,这取决于需要预先添加的数据量(实际上越多越好),但是它不会占用内存。
<?php $cache_new = "Prepend this"; // this gets prepended $file = "file.dat"; // the file to which $cache_new gets prepended $handle = fopen($file, "r+"); $len = strlen($cache_new); $final_len = filesize($file) + $len; $cache_old = fread($handle, $len); rewind($handle); $i = 1; while (ftell($handle) < $final_len) { fwrite($handle, $cache_new); $cache_new = $cache_old; $cache_old = fread($handle, $len); fseek($handle, $i * $len); $i++; } ?>
$prepend = 'prepend me please'; $file = '/path/to/file'; $fileContents = file_get_contents($file); file_put_contents($file, $prepend . $fileContents);
$filename = "log.txt"; $file_to_read = @fopen($filename, "r"); $old_text = @fread($file_to_read, 1024); // max 1024 @fclose(file_to_read); $file_to_write = fopen($filename, "w"); fwrite($file_to_write, "new text".$old_text);
另一个(粗略的)build议:
$tempFile = tempnam('/tmp/dir'); $fhandle = fopen($tempFile, 'w'); fwrite($fhandle, 'string to prepend'); $oldFhandle = fopen('/path/to/file', 'r'); while (($buffer = fread($oldFhandle, 10000)) !== false) { fwrite($fhandle, $buffer); } fclose($fhandle); fclose($oldFhandle); rename($tempFile, '/path/to/file');
这具有使用临时文件的缺点,但效率很高。
当使用fopen()时,你可以设置模式来设置指针(即开始或结束。
$afile = fopen("file.txt", "r+");
'r'仅供阅读; 将文件指针放在文件的开头。
'r +'开放阅读和写作; 将文件指针放在文件的开头。
$file = fopen('filepath.txt', 'r+') or die('Error'); $txt = "/n".$string; fwrite($file, $txt); fclose($file);
这将在文本文件中添加一个空白行,所以下次写入它时,将replace空白行。 有一个空行和你的string。
这是唯一和最好的伎俩。