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(())
}

注意事项

  1. deno_fs主要提供异步API,使用时需要配合异步运行时(如tokio)
  2. 跨平台行为可能略有差异,特别是在权限和路径处理方面
  3. 对于高性能场景,考虑使用标准库的同步API或更低级别的系统调用

deno_fs为Rust提供了Deno风格的文件系统操作接口,特别适合需要与Deno生态交互或需要统一跨平台行为的应用场景。

回到顶部