2017-04-16 37 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