Rustファイルアクセス

stdクレートのfsモジュールに必要な機能がまとめられている
use std::fs::File;

fileが得られたら、BufReader構造体のインスタンスを作成する
use std::io::{BufRead, BufReader}

data.txt

Hello!
This is sample text file
It takes text and display it.
file end.

data.txtを読み込み表示する

use std::fs::File;
use std::io::{BufRead, BufReader};

fn main(){
	let file = File::open("data.txt").unwrap();
	let reader = BufReader::new(file);

	let mut count = 0;
	for line in reader.lines() {
		count += 1;
		let txt = line.unwrap();
		println!("{}: {}", count, txt);
	}
}

### File取得とエラー処理

use std::fs::File;
use std::io::{BufRead, BufReader};
use std::io::ErrorKind;

fn main(){
	let file = match File::open("data.txt") {
		Ok(file) => file,
		Err(error) => match error.kind(){
			ErrorKind::NotFound => panic!("ファイルが見つかりませんでした"),
			ErrorKind::PermissionDenied => panic!("ファイルへのアクセス権限がありません"),
			_ => panic!("ファイルのオープンに失敗しました:{:?}", error),
		},
	};

	let reader = BufReader::new(file);

	for line in reader.lines() {
		println!("{}", line.unwrap());
	}
}

### ファイルにテキストを保存する

use std::fs::File;
use std::io::Write;

fn main(){
	let data = [
		"Hello world!",
		"これはサンプルデータです。",
		"テストテスト!"
	];
	let str_data = data.join("\n");
	let mut file = File::create("backup.txt").unwrap();
	file.write_all(str_data.as_bytes()).unwrap();
}

### ファイルにデータを追記する

use std::fs::OpenOptions;
use std::io::Write;

fn main() {
	let str_data = "This is sample!\n";
	let mut file = OpenOptions::new()
		.create(true)
		.append(true)
		.open("append.txt").unwrap();
	file.write_all(str_data.as_bytes()).unwrap();
}

### ファイル一覧の取得

use std::fs;

fn main() {
	let paths = fs::read_dir("./").unwrap();

	for path in paths {
		let entry = path.unwrap();
		println!("{:?}", entry.path().to_str());
	}
}

### エントリーの種類を調べる

use std::fs;

fn main() {
	let paths = fs::read_dir("./").unwrap();

	for path in paths {
		let entry = path.unwrap();
		let ftype = entry.file_type().unwrap();
		if ftype.is_file() {
			println!("{:?} file", entry.path())
		} else if ftype.is_dir(){
			println!("{:?} dir", entry.path())
		} else if ftype.is_symlink() {
			println!("{:?} link", entry.path())
		} else {
			println!("{:?}", entry.path())
		}
	}
}

### ファイル/フォルダの操作
fs::create_dir(), fs::copy(), fs::move(), fs::remove_file(), fs::remove_dir(), fs::remove_dir_all()

use std::fs;

fn main() {
	_ = fs::create_dir("./backup");
	let entries = fs::read_dir("./").unwrap();

	for path in entries {
		let entry = path.unwrap();
		if entry.file_type().unwrap().is_file(){
			let file_name = entry.file_name();
			let from_name = format!("./{}", file_name.to_string_lossy());
			let to_name = format!("./backup/_{}", file_name.to_string_lossy());

			_ = fs::copy(&from_name, &to_name);
			println!("backup: {:?} -> {}", from_name, to_name);
		} else {
			println!("not copied.({:?})", entry.file_name());
		}
	}
}