- 文件系统操作
- 参见:
- 参见:
文件系统操作
std: 模块包含几个处理文件系统的函数。
:fs
use std::fs;use std::fs::{File, OpenOptions};use std::io;use std::io::prelude::*;use std::os::unix;use std::path::Path;// `% cat path` 的简单实现fn cat(path: &Path) -> io::Result<String> {let mut f = try!(File::open(path));let mut s = String::new();match f.read_to_string(&mut s) {Ok(_) => Ok(s),Err(e) => Err(e),}}// `% echo s > path` 的简单实现fn echo(s: &str, path: &Path) -> io::Result<()> {let mut f = try!(File::create(path));f.write_all(s.as_bytes())}// `% touch path`(忽略已存在文件)的简单实现fn touch(path: &Path) -> io::Result<()> {match OpenOptions::new().create(true).write(true).open(path) {Ok(_) => Ok(()),Err(e) => Err(e),}}fn main() {println!("`mkdir a`");// 创建一个目录,返回 `io::Result<()>`match fs::create_dir("a") {Err(why) => println!("! {:?}", why.kind()),Ok(_) => {},}println!("`echo hello > a/b.txt`");// 前面的匹配可以用 `unwrap_or_else` 方法简化echo("hello", &Path::new("a/b.txt")).unwrap_or_else(|why| {println!("! {:?}", why.kind());});println!("`mkdir -p a/c/d`");// 递归创建一个目录,返回 `io::Result<()>`fs::create_dir_all("a/c/d").unwrap_or_else(|why| {println!("! {:?}", why.kind());});println!("`touch a/c/e.txt`");touch(&Path::new("a/c/e.txt")).unwrap_or_else(|why| {println!("! {:?}", why.kind());});println!("`ln -s ../b.txt a/c/b.txt`");// 创建一个符号链接,返回 `io::Resutl<()>`if cfg!(target_family = "unix") {unix::fs::symlink("../b.txt", "a/c/b.txt").unwrap_or_else(|why| {println!("! {:?}", why.kind());});}println!("`cat a/c/b.txt`");match cat(&Path::new("a/c/b.txt")) {Err(why) => println!("! {:?}", why.kind()),Ok(s) => println!("> {}", s),}println!("`ls a`");// 读取目录的内容,返回 `io::Result<Vec<Path>>`match fs::read_dir("a") {Err(why) => println!("! {:?}", why.kind()),Ok(paths) => for path in paths {println!("> {:?}", path.unwrap().path());},}println!("`rm a/c/e.txt`");// 删除一个文件,返回 `io::Result<()>`fs::remove_file("a/c/e.txt").unwrap_or_else(|why| {println!("! {:?}", why.kind());});println!("`rmdir a/c/d`");// 移除一个空目录,返回 `io::Result<()>`fs::remove_dir("a/c/d").unwrap_or_else(|why| {println!("! {:?}", why.kind());});}
下面是预期成功的输出:
$ rustc fs.rs && ./fs`mkdir a``echo hello > a/b.txt``mkdir -p a/c/d``touch a/c/e.txt``ln -s ../b.txt a/c/b.txt``cat a/c/b.txt`> hello`ls a`> a/b.txt> a/c`walk a`> a/c> a/c/b.txt> a/c/e.txt> a/c/d> a/b.txt`rm a/c/e.txt``rmdir a/c/d`
且 a 目录的最终状态为:
$ tree aa|-- b.txt`-- c`-- b.txt -> ../b.txt1 directory, 2 files
另一种定义 cat 函数的方式是使用 ? 标记:
fn cat(path: &Path) -> io::Result<String> {let mut f = File::open(path)?;let mut s = String::new();f.read_to_string(&mut s)?;Ok(s)}
参见:
cfg!
