继续练练Rust和Vue3, 写个简易文件浏览器
用到Rust文件系统标准库, serde库Json序列化 前端Ant Design Vue 3.2 项目全部代码 https://github.com/LeoBest2/rust-tauri-example
效果图
后端
main.rs代码
#![cfg_attr(
all(not(debug_assertions), target_os = "windows"),
windows_subsystem = "windows"
)]
use std::{
env, fs, io,
path::{Path, PathBuf},
};
use serde::{Deserialize, Serialize};
#[derive(Debug, Serialize, Deserialize)]
#[serde(tag = "value")]
enum FileType {
Dir,
File,
Symlink,
}
#[derive(Debug, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
struct FileEntry {
file_name: String,
file_path: String,
file_type: FileType,
file_size: u64,
}
fn _list_dir(path: &str) -> io::Result
let mut p = PathBuf::from(path);
if p.is_relative() {
p = env::current_dir()?;
}
let mut entries = vec![FileEntry {
file_name: "..".to_string(),
file_path: p
.parent()
.unwrap_or(Path::new("/"))
.to_str()
.unwrap()
.to_string(),
file_type: FileType::Dir,
file_size: 0,
}];
for entry in fs::read_dir(path)? {
let entry = entry?;
let metadata = entry.metadata()?;
let file_type;
if metadata.is_dir() {
file_type = FileType::Dir;
} else if metadata.is_file() {
file_type = FileType::File;
} else if metadata.is_symlink() {
file_type = FileType::Symlink;
} else {
continue;
};
entries.push(FileEntry {
file_name: entry.file_name().into_string().unwrap(),
file_path: p.join(entry.file_name()).to_str().unwrap().to_string(),
file_type,
file_size: metadata.len(),
});
}
Ok(entries)
}
#[tauri::command]
fn list_dir(path: &str) -> Vec
match _list_dir(path) {
Ok(r) => r,
Err(e) => vec![FileEntry {
file_name: format!("error: {}", e.to_string()),
file_path: path.to_string(),
file_type: FileType::Dir,
file_size: 0,
}],
}
}
fn main() {
tauri::Builder::default()
.invoke_handler(tauri::generate_handler![list_dir])
.run(tauri::generate_context!())
.expect("error while running tauri application");
}
前端
App.vue
import { onMounted, ref } from "vue";
import { invoke } from "@tauri-apps/api/tauri";
import { message } from 'ant-design-vue';
const columns = [
{
title: '文件名',
dataIndex: 'fileName',
key: 'fileName',
},
{
title: '文件类型',
dataIndex: 'fileType',
key: 'fileType'
},
{
title: '文件大小(字节)',
dataIndex: 'fileSize',
key: 'fileSize'
}
];
const data = ref([]);
const title = ref('');
function listDir(path) {
invoke("list_dir", { path: path })
.then((response) => {
data.value = response;
if (response.length >= 1) {
title.value = response[0].filePath;
}
})
.catch((e) => message.error(`查看目录错误: ${e}`));
}
onMounted(() => {
listDir('.');
});
{{ title }}
record.fileName
}}
{{ record.fileName }}
record.fileType.value
}}
record.fileType.value
}}
精彩文章
发表评论