我正在尝试在文本文件的开头添加一个新行。我首先使用 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
打开文件,我最终会覆盖数据而不是添加数据。使用 Rust 完成此任务的合适方法是什么? 最佳答案
你不能用任何编程语言直接做到这一点。在 C# 、 Python 、 NodeJs 、 PHP 、 Bash 和 C 中查看有关同一主题的其他一些问题。
有几种具有不同权衡的解决方案:
从 Stack Overflow 上搜索,第三个解决方案似乎是其他语言最受欢迎的答案,例如in Bash 。这可能是因为它快速、安全并且通常只需几行代码即可实现。
一个快速的 Rust 版本看起来像这样:
extern crate mktemp;
use mktemp::Temp;
use std::{fs, io, io::Write, fs::File, path::Path};
fn prepend_file<P: AsRef<Path>>(data: &[u8], file_path: &P) -> io::Result<()> {
// Create a temporary file
let mut tmp_path = Temp::new_file()?;
// Stop the temp file being automatically deleted when the variable
// is dropped, by releasing it.
tmp_path.release();
// Open temp file for writing
let mut tmp = File::create(&tmp_path)?;
// Open source file for reading
let mut src = File::open(&file_path)?;
// Write the data to prepend
tmp.write_all(&data)?;
// Copy the rest of the source file
io::copy(&mut src, &mut tmp)?;
fs::remove_file(&file_path)?;
fs::rename(&tmp_path, &file_path)?;
Ok(())
}
用法:
fn main() -> io::Result<()> {
let file_path = Path::new("file.txt");
let data = "Data to add to the beginning of the file\n";
prepend_file(data.as_bytes(), &file_path)?;
Ok(())
}
关于file - 在文件开头添加一行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43441166/