在PHP中,如果您寫入文件,它將寫入該現有文件的結尾。如何將文件添加到開頭?
我們如何在文件開頭預先寫入一個文件?
我試過rewind($handle)
功能,但似乎覆蓋,如果當前內容比現有的大。
任何想法?
在PHP中,如果您寫入文件,它將寫入該現有文件的結尾。如何將文件添加到開頭?
我們如何在文件開頭預先寫入一個文件?
我試過rewind($handle)
功能,但似乎覆蓋,如果當前內容比現有的大。
任何想法?
file_get_contents解決方案對大文件而言效率低下。這個解決方案可能需要更長時間,這取決於需要預先填充的數據量(實際上越多越好),但它不會佔用內存。
<?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++;
}
?>
'file_get_contents()'[docs](http://php.net/manual/en/function.file-get-contents.php)確實會這樣說:「...是首選將文件內容讀入字符串的方式,如果操作系統支持,將使用內存映射技術來提高性能。「 – alex 2010-07-26 05:45:49
@alex它仍然意味着它會將所有內容一次性讀入內存中。Fraxtil的方法使用的內存很少,但步驟很多,這取決於哪個環境更高效...... – deceze 2010-07-26 05:49:30
@deceze感謝您的信息 – alex 2010-07-26 05:54:43
$prepend = 'prepend me please';
$file = '/path/to/file';
$fileContents = file_get_contents($file);
file_put_contents($file, $prepend . $fileContents);
當使用fopen()函數可以設置模式設置指針(即begginng或端
$afile = fopen("file.txt", "r+");
「R」打開僅供讀取;地方 文件指針在 文件開頭
「R +」開放式閱讀和寫作 ;。發生在 開始的文件的文件指針
仍然會覆蓋開始行 – mathew 2010-07-26 05:34:32
另一個(粗糙)建議:
$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');
這有使用臨時文件的缺點,但在其他方面相當有效。
$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);
$file = fopen('filepath.txt', 'r+') or die('Error');
$txt = "/n".$string;
fwrite($file, $txt);
fclose($file);
這將在文本文件中添加一個空行,所以下次你寫它的時候你更換空行。用空行和你的字符串。
這是唯一和最好的把戲。
不美觀的方法是讀取文件內容,將所有內容前置,然後重寫整個文件。不確定是否有另一種方式。如果你對一個巨大的文件進行小小的修改,那麼這並不是完全「輕鬆」,但是如果你正在處理一個小的100char文件,這將會很好。 – Warty 2010-07-26 04:50:20
你不是說要預先安排嗎? – 2010-07-26 04:58:09
你可能想用UNIX工具做到這一點,如果這是可能的話:http://stackoverflow.com/questions/54365/prepend-to-a-file-one-liner-shell – deceze 2010-07-26 05:04:52