Rust文件系统操作库deno_fs的使用,deno_fs提供跨平台文件读写与目录管理功能
deno_fs
这个crate提供了与文件系统交互的操作。
安装
在项目目录中运行以下Cargo命令:
cargo add deno_fs
或者在Cargo.toml中添加:
deno_fs = "0.122.0"
使用示例
以下是一个完整的示例demo,展示如何使用deno_fs进行基本的文件系统操作:
use deno_fs::FileSystem;
use std::path::Path;
fn main() -> std::io::Result<()> {
// 创建文件系统实例
let fs = FileSystem::new();
// 创建目录
fs.create_dir_all("example_dir")?;
// 写入文件
fs.write_file("example_dir/test.txt", "Hello, deno_fs!")?;
// 读取文件
let content = fs.read_file("example_dir/test.txt")?;
println!("File content: {}", content);
// 检查文件是否存在
if fs.exists(Path::new("example_dir/test.txt")) {
println!("File exists");
}
// 删除文件
fs.remove_file("example_dir/test.txt")?;
// 删除目录
fs.remove_dir_all("example_dir")?;
Ok(())
}
功能说明
- 跨平台文件读写操作
- 目录创建与管理
- 文件存在性检查
- 文件删除操作
文档
更多详细使用方法请参考官方文档。
完整示例代码
以下是一个更完整的示例,展示deno_fs的更多功能:
use deno_fs::FileSystem;
use std::path::Path;
fn main() -> std::io::Result<()> {
// 初始化文件系统实例
let fs = FileSystem::new();
// 1. 目录操作
// 创建多级目录
fs.create_dir_all("parent_dir/child_dir")?;
// 列出目录内容
if let Ok(entries) = fs.read_dir("parent_dir") {
for entry in entries {
println!("Directory entry: {:?}", entry?.path());
}
}
// 2. 文件操作
// 写入多个文件
fs.write_file("parent_dir/file1.txt", "First file")?;
fs.write_file("parent_dir/child_dir/file2.txt", "Second file")?;
// 复制文件
fs.copy("parent_dir/file1.txt", "parent_dir/file1_copy.txt")?;
// 重命名文件
fs.rename("parent_dir/file1_copy.txt", "parent_dir/renamed.txt")?;
// 3. 文件信息获取
if let Ok(metadata) = fs.metadata("parent_dir/renamed.txt") {
println!("File size: {} bytes", metadata.len());
println!("Is directory: {}", metadata.is_dir());
}
// 4. 清理操作
fs.remove_file("parent_dir/renamed.txt")?;
fs.remove_dir_all("parent_dir")?;
println!("All operations completed successfully!");
Ok(())
}
1 回复
Rust文件系统操作库deno_fs使用指南
deno_fs
是一个提供跨平台文件读写与目录管理功能的Rust库,它是Deno运行时文件系统操作的Rust实现部分。
主要功能
- 跨平台文件系统操作
- 文件和目录的创建、读取、写入
- 文件元数据查询
- 符号链接操作
- 文件系统监视
基本使用方法
添加依赖
首先在Cargo.toml
中添加依赖:
[dependencies]
deno_fs = "0.1"
文件读写示例
use deno_fs::FileSystem;
use std::path::Path;
async fn file_operations() -> std::io::Result<()> {
let fs = deno_fs::RealFs;
let path = Path::new("example.txt");
// 写入文件
fs.write_file(&path, b"Hello, deno_fs!").await?;
// 读取文件
let content = fs.read_file(&path).await?;
println!("File content: {}", String::from_utf8_lossy(&content));
// 追加内容
fs.write_file(&path, b"\nAppended line").await?;
Ok(())
}
目录操作示例
use deno_fs::FileSystem;
use std::path::Path;
async fn directory_operations() -> std::io::Result<()> {
let fs = deno_fs::RealFs;
let dir_path = Path::new("test_dir");
// 创建目录
fs.mkdir(&dir_path, true).await?; // true表示递归创建
// 列出目录内容
let entries = fs.read_dir(&dir_path).await?;
for entry in entries {
println!("Found: {}", entry.path().display());
}
// 删除目录
fs.remove_dir_all(&dir_path).await?;
Ok(())
}
文件元数据查询
use deno_fs::FileSystem;
use std::path::Path;
async fn metadata_example() -> std::io::Result<()> {
let fs = deno_fs::RealFs;
let path = Path::new("example.txt");
let metadata = fs.metadata(&path).await?;
println!("File size: {} bytes", metadata.len());
println!("Is directory: {}", metadata.is_dir());
Ok(())
}
高级功能
文件系统监视
use deno_fs::{FileSystem, FsWatcher};
use std::path::Path;
async fn watch_example() -> std::io::Result<()> {
let fs = deno_fs::RealFs;
let path = Path::new(".");
let mut watcher = fs.watch(&path, true)?; // true表示递归监视
loop {
match watcher.next().await {
Some(event) => println!("File event: {:?}", event),
None => break,
}
}
Ok(())
}
符号链接操作
use deno_fs::FileSystem;
use std::path::Path;
async fn symlink_example() -> std::io::Result<()> {
let fs = deno_fs::RealFs;
let src = Path::new("original.txt");
let dest = Path::new("link.txt");
// 创建符号链接
fs.symlink(&src, &dest).await?;
// 读取符号链接目标
let target = fs.read_link(&dest).await?;
println!("Link points to: {}", target.display());
Ok(())
}
完整示例demo
下面是一个综合使用deno_fs的完整示例,展示了文件操作、目录操作和文件监视的功能:
use deno_fs::{FileSystem, FsWatcher};
use std::path::Path;
use tokio; // 需要添加tokio依赖
#[tokio::main]
async fn main() -> std::io::Result<()> {
let fs = deno_fs::RealFs;
// 1. 创建测试目录
let test_dir = Path::new("deno_fs_test");
fs.mkdir(&test_dir, true).await?;
println!("目录创建成功: {}", test_dir.display());
// 2. 创建并写入文件
let file_path = test_dir.join("test_file.txt");
fs.write_file(&file_path, b"初始内容").await?;
println!("文件创建并写入成功: {}", file_path.display());
// 3. 读取文件内容
let content = fs.read_file(&file_path).await?;
println!("文件内容: {}", String::from_utf8_lossy(&content));
// 4. 追加内容
fs.write_file(&file_path, b"\n追加的内容").await?;
println!("内容追加成功");
// 5. 查询文件元数据
let metadata = fs.metadata(&file_path).await?;
println!(
"文件大小: {} bytes, 最后修改时间: {:?}",
metadata.len(),
metadata.modified()?
);
// 6. 设置文件监视
println!("设置文件系统监视(5秒)...");
let mut watcher = fs.watch(&test_dir, true)?;
tokio::spawn(async move {
tokio::time::sleep(std::time::Duration::from_secs(5)).await;
println!("监视结束");
});
while let Some(event) = watcher.next().await {
println!("文件系统事件: {:?}", event);
}
// 7. 清理测试目录
fs.remove_dir_all(&test_dir).await?;
println!("测试目录已清理");
Ok(())
}
注意事项
deno_fs
主要提供异步API,使用时需要配合异步运行时(如tokio)- 跨平台行为可能略有差异,特别是在权限和路径处理方面
- 对于高性能场景,考虑使用标准库的同步API或更低级别的系统调用
deno_fs
为Rust提供了Deno风格的文件系统操作接口,特别适合需要与Deno生态交互或需要统一跨平台行为的应用场景。