Electron 开发者的 Tauri 2.0 实战指南:文件系统操作

作为 Electron 开发者,我们习惯了使用 Node.js 的 fs 模块来处理文件操作。在 Tauri 2.0 中,文件系统操作被重新设计,采用了 Rust 的安全特性和权限系统。本文将帮助你理解和重构这部分功能。

文件操作对比

Electron 的文件操作

在 Electron 中,我们通常这样处理文件:

// main.js
const fs = require('fs').promises
const path = require('path')

// 读取文件
async function readFile(filePath) {
  try {
    const content = await fs.readFile(filePath, 'utf8')
    return content
  } catch (error) {
    console.error('Failed to read file:', error)
    throw error
  }
}

// 写入文件
async function writeFile(filePath, content) {
  try {
    await fs.writeFile(filePath, content, 'utf8')
  } catch (error) {
    console.error('Failed to write file:', error)
    throw error
  }
}

// 列出目录内容
async function listDirectory(dirPath) {
  try {
    const files = await fs.readdir(dirPath)
    return files
  } catch (error) {
    console.error('Failed to list directory:', error)
    throw error
  }
}

主要特点:

  1. 直接访问文件系统
  2. 无权限限制
  3. 同步/异步操作
  4. 完整的 Node.js API

Tauri 的文件操作

Tauri 采用了更安全的方式:

// main.rs
use std::fs;
use tauri::api::path;
use serde::{Deserialize, Serialize};

#[derive(Debug, Serialize)]
struct FileEntry {
    name: String,
    path: String,
    is_file: bool,
    size: u64,
}

#[tauri::command]
async fn read_file(path: String) -> Result<String, String> {
    fs::read_to_string(path)
        .map_err(|e| e.to_string())
}

#[tauri::command]
async fn write_file(path: String, content: String) -> Result<(), String> {
    fs::write(path, content)
        .map_err(|e| e.to_string())
}

#[tauri::command]
async fn list_directory(path: String) -> Result<Vec<FileEntry>, String> {
    let mut entries = Vec::new();

    for entry in fs::read_dir(path).map_err(|e| e.to_string())? {
        let entry = entry.map_err(|e| e.to_string())?;
        let metadata = entry.metadata().map_err(|e| e.to_string())?;

        entries.push(FileEntry {
            name: entry.file_name().to_string_lossy().into_owned(),
            path: entry.path().to_string_lossy().into_owned(),
            is_file: metadata.is_file(),
            size: metadata.len(),
        });
    }

    Ok(entries)
}
// fileSystem.ts
import { invoke } from '@tauri-apps/api/tauri'
import { BaseDirectory, createDir, readDir } from '@tauri-apps/api/fs'

interface FileEntry {
  name: string
  path: string
  isFile: boolean
  size: number
}

// 读取文件
export const readFile = async (path: string): Promise<string> => {
  try {
    return await invoke('read_file', { path })
  } catch (error) {
    console.error('Failed to read file:', error)
    throw error
  }
}

// 写入文件
export const writeFile = async (path: string, content: string): Promise<void> => {
  try {
    await invoke('write_file', { path, content })
  } catch (error) {
    console.error('Failed to wri
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值