2017-04-16 101 views
2

我正在嘗試將新行添加到文本文件的開頭。我首先打開文件append,但只允許我使用write_all寫入文件末尾,至少這是我得到的結果。如果我正確閱讀文檔,這是設計。上行至文件開頭

我試過玩seek,但沒有解決它。

這是我目前:

let mut file = OpenOptions::new().append(true).open(&file_path).unwrap(); 
file.seek(SeekFrom::Start(0)); 
file.write_all(b"Cool days\n"); 

如果我打開與write文件,我結束了重寫數據,而不是添加的。什麼是適當的方式去完成這與鏽?

+0

如果添加一行到文件的開始,這將需要移動所有的文件內容其餘的,來容納它。在任何編程語言中都沒有辦法解決這個問題。請參閱[在C#中的這個例子](http://stackoverflow.com/questions/1343044/c-prepending-to-beginning-of-a-file)。 –

回答

7

您不能直接在任何編程語言中執行此操作。請參閱C#,Python,NodeJs,PHP,BashC中關於同一主題的其他一些問題。

有幾種解決方案具有不同的權衡:

  1. 拷貝整個文件到內存中,寫上你想要的數據,然後後寫入文件的剩餘部分。如果文件很大,這可能是一個不好的解決方案,因爲它將使用大量的內存。

  2. 使用一個緩衝區,其大小與要預先設置的文本大小相同。一次將文件的塊複製到內存中,然後用前一個塊覆蓋它。通過這種方式,您可以將文件的內容隨着新文本一起拖動。這可能比第一種方法慢,但不需要大量的內存分配。

  3. 將新數據寫入臨時文件,然後追加原始內容。然後刪除原始文件並重命名臨時文件。從Stack Overflow上搜索,這似乎也是其他語言中最受歡迎的解決方案,例如in Bash

+0

謝謝,這回答了我的問題。我想象的是這樣的解決方案,但對我自己來說,它似乎重新發明了輪子,但顯然這個輪子真的需要再次做出。這將使一個偉大的lib btw。 – pedronveloso