rust - 如何修改文件的内容而不是在 Rust 中添加到文件中?
问题描述
我以为你只是打开一个文件并寻找你想要覆盖并开始写入的位置,但它似乎只在那个位置添加字节。如何从文件中删除字节或覆盖字节?
一个例子:
use std::fs::OpenOptions;
use std::io::{prelude::*, Seek, SeekFrom};
fn main() {
let mut file = OpenOptions::new()
.read(true)
.append(true)
.create(true)
.open("/tmp/file.db")
.unwrap();
let bytes: [u8; 4] = [1, 2, 3, 4];
file.seek(SeekFrom::Start(0)).unwrap();
file.write_all(&bytes).unwrap();
}
之前的输出文件:
00000000: 0102 0304 0a .....
之后的输出文件:
00000000: 0102 0304 0102 0304 0a .........
如您所见,寻求 0 不会覆盖文件中已有的 4 个字节。相反,它将它们添加到文件中。
解决方案
这是因为您使用的是append(true)
. 从文档中:
此选项为 true 时,意味着写入将附加到文件而不是覆盖以前的内容。请注意,设置
.write(true).append(true)
与仅设置具有相同的效果.append(true)
。
改为使用write(true)
,添加写权限:
let mut file = OpenOptions::new()
.read(true)
.write(true) // <--------- this
.create(true)
.open("/tmp/file.db")
.unwrap();
..您的代码将按预期工作。
推荐阅读
- swiftui - SwiftUI的MagnificationGesture会装死失败?
- gremlin - 合并顶点,包括属性和传入/传出边
- typescript - puppeteer:如何为 REACT 和 Typescript 的输入元素设置值
- reactjs - 如何在反应钩子中停止组件重新渲染?
- javascript - 如果元素被点击,jQuery .click 不执行以下代码
- r - 变量中导数 D() 的 uniroot()(或如何将对象编写为函数)
- spring-boot - Google Cloud Storage - 如何访问存储桶内的静态资源等文件夹和文件 - Spring Boot
- algorithm - 峰值编码挑战中距离的定义
- java - java.lang.IllegalArgumentException:无效的连接字符串。使用 mockito 测试服务层时
- r - 在 r 中创建联合频率分布表