2010-07-26 179 views
9

在PHP中,如果您寫入文件,它將寫入該現有文件的結尾。如何將文件添加到開頭?

我們如何在文件開頭預先寫入一個文件?

我試過rewind($handle)功能,但似乎覆蓋,如果當前內容比現有的大。

任何想法?

+3

不美觀的方法是讀取文件內容,將所有內容前置,然後重寫整個文件。不確定是否有另一種方式。如果你對一個巨大的文件進行小小的修改,那麼這並不是完全「輕鬆」,但是如果你正在處理一個小的100char文件,這將會很好。 – Warty 2010-07-26 04:50:20

+1

你不是說要預先安排嗎? – 2010-07-26 04:58:09

+0

你可能想用UNIX工具做到這一點,如果這是可能的話:http://stackoverflow.com/questions/54365/prepend-to-a-file-one-liner-shell – deceze 2010-07-26 05:04:52

回答

12

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++; 
} 
?> 
+2

'file_get_contents()'[docs](http://php.net/manual/en/function.file-get-contents.php)確實會這樣說:「...是首選將文件內容讀入字符串的方式,如果操作系統支持,將使用內存映射技術來提高性能。「 – alex 2010-07-26 05:45:49

+0

@alex它仍然意味着它會將所有內容一次性讀入內存中。Fraxtil的方法使用的內存很少,但步驟很多,這取決於哪個環境更高效...... – deceze 2010-07-26 05:49:30

+0

@deceze感謝您的信息 – alex 2010-07-26 05:54:43

18
$prepend = 'prepend me please'; 

$file = '/path/to/file'; 

$fileContents = file_get_contents($file); 

file_put_contents($file, $prepend . $fileContents); 
+0

Alex有一個更正$ fileContents =的file_get_contents($文件); – mathew 2010-07-26 05:05:06

+0

@matthew哎呦,謝謝你的選擇。 – alex 2010-07-26 05:07:59

+0

亞歷克斯多一個問題..如果這是一個大文件,然後讀/寫可能需要更多的時間嗎? – mathew 2010-07-26 05:08:17

-2

當使用fopen()函數可以設置模式設置指針(即begginng或端

$afile = fopen("file.txt", "r+"); 

「R」打開僅供讀取;地方 文件指針在 文件開頭

「R +」開放式閱讀和寫作 ;。發生在 開始的文件的文件指針

+8

仍然會覆蓋開始行 – mathew 2010-07-26 05:34:32

0

另一個(粗糙)建議:

$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'); 

這有使用臨時文件的缺點,但在其他方面相當有效。

3
$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); 
+0

我喜歡緊湊性 – Cesar 2013-12-08 07:53:56

+0

'$ fo'和'$ fow'用於什麼? – bzeaman 2016-03-02 21:27:14

+0

是的,首先'$ fo'是'$ for',第二個'$ fo'是'$ fow'必須是 – misima 2016-07-13 19:20:07

-2
  $file = fopen('filepath.txt', 'r+') or die('Error'); 
      $txt = "/n".$string; 
      fwrite($file, $txt); 
      fclose($file); 

這將在文本文件中添加一個空行,所以下次你寫它的時候你更換空行。用空行和你的字符串。

這是唯一和最好的把戲。

相關問題