use std::io::fs;
use std::io::fs::PathExtensions;
use std::io::{File, IoResult, USER_RWX};
// A simple implementation of `% cat path`
fn cat(path: &Path) -> IoResult<String> {
File::open(path).and_then(|mut f| f.read_to_string())
}
// A simple implementation of `% echo s > path`
fn echo(s: &str, path: &Path) -> IoResult<()> {
File::create(path).and_then(|mut f| f.write_str(s))
}
// A simple implementation of `% touch path` (ignores existing files)
fn touch(path: &Path) -> IoResult<()> {
if !path.exists() {
File::create(path).and_then(|_| Ok(()))
} else {
Ok(())
}
}
fn main() {
println!("`mkdir a`");
// Create a directory, returns `IoResult<()>`
match fs::mkdir(&Path::new("a"), USER_RWX) {
Err(why) => println!("! {}", why.kind),
Ok(_) => {},
}
println!("`echo hello > a/b.txt`");
// The previous match can be simplified using the `unwrap_or_else` method
echo("hello", &Path::new("a/b.txt")).unwrap_or_else(|why| {
println!("! {}", why.kind);
});
println!("`mkdir -p a/c/d`");
// Recursively create a directory, returns `IoResult<()>`
fs::mkdir_recursive(&Path::new("a/c/d"), USER_RWX).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`");
// Create a symbolic link, returns `IoResult<()>`
fs::symlink(&Path::new("../b.txt"),
&Path::new("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`");
// Read the contents of a directory, returns `IoResult<Vec<Path>>`
match fs::readdir(&Path::new("a")) {
Err(why) => println!("! {}", why.kind),
Ok(paths) => for path in paths.iter() {
println!("> {}", path.display());
},
}
println!("`walk a`");
// Recursively walk over the contents of a directory, returns
// `Directories`, which implements the `Iterator<Path> trait
match fs::walk_dir(&Path::new("a")) {
Err(why) => println!("! {}", why.kind),
Ok(mut paths) => for path in paths {
println!("> {}", path.display());
},
}
println!("`rm a/c/e.txt`");
// Remove a file, returns `IoResult<()>`
fs::unlink(&Path::new("a/c/e.txt")).unwrap_or_else(|why| {
println!("! {}", why.kind);
});
println!("`rmdir a/c/d`");
// Remove an empty directory, returns `IoResult<()>`
fs::rmdir(&Path::new("a/c/d")).unwrap_or_else(|why| {
println!("! {}", why.kind);
});
}
You won't be able to run the previous code, because the playpen doesn't allow
file operations. Here's the expected successful output: