【Rust】ファイル操作まとめ


Rustでいくつかプログラムを作りましたが、
そういえばファイル操作をしたことがありませんでした。
なのでいつか役立てるためにここにファイル操作に関して、
簡単にまとめたいと思います。
公式ドキュメントの内容を自分なりに掻い摘んでいきたいと思います。


ファイル作成


Rustでファイルを作成するサンプルプログラムです。

use std::fs::File;
use std::io::{Error, self, Write};

fn file_create() -> Result<(), Error> {
    println!("Enter filename");
    let mut name = String::new();
    io::stdin().read_line(&mut name)?;

    let mut f = File::create(name.trim())?;
    let mut input = String::new();
    io::stdin().read_line(&mut input)?;
    f.write_all(input.as_bytes())?;
    Ok(())
}

fn main() {
    match file_create() {
        Ok(()) => {
            println!("OK:file_create ");
        }
        Err(e) => {
            println!("Error:{}", e);
        }
    }
}

ファイル作成のサンプルと異なるのは基本的にはFile::create(“ファイル名”)でフィルを作成することができます。
この場合だと常に新規作成になるようで、
追加ではなく編集をしたい場合別の関数を使います。

ここではファイル名を標準入力で指定していますが、
createに渡す際にtrim()を実行して改行コードを取り除いています。

writeまたはwrite_allでファイルに書き込みますが、
byteに変換してから書き込む必要があるみたいですね。

ちなみに上記のサンプルプログラムでは、
ファイル操作に生じる可能性のあるエラーを捕捉するためmatchに渡しています。

ファイルからの読み込み


ファイルからデータを読み込むサンプルです。

use std::fs::File;
use std::io::{Error, self, Read};


fn get_file_contents() -> Result<String, Error> {
    println!("Enter filename");
    let mut name = String::new();
    
    io::stdin().read_line(&mut name)?;

    let mut f = File::open(name.trim())?;
    let mut contents = String::new();
    f.read_to_string(&mut contents)?;
    Ok(contents)
}

fn main() {
    match get_file_contents() {
        Ok(contents) => {
            println!("OK:file_open ");
            println!("{}", contents);
        }
        Err(e) => {
            println!("Error:{}", e);
        }
    }
}


File::openにファイル名を指定して、ファイルを開きます。
ファイルからデータを取得する際にはread_to_stringを使います。

このサンプルではファイルを開きデータを取得する関数をmatchに渡し、
正常終了時の戻り値に指定しています。

あとはprintln!で出力するなりするだけですね。

OpenOptions


上に挙げた二つのサンプルではFile::create、File::openでファイルを開きましたが、
openoptionsで細かいオプションを指定して開くこともできます。
たとえばcreateで開くと常に新規作成になりますが、
openoptions::newのappendを使うとファイルの編集もできます。

use std::fs::OpenOptions;
use std::io::{Error, self, Write};

fn file_append() -> Result<(), Error> {
    println!("Enter filename");
    let mut name = String::new();
    io::stdin().read_line(&mut name)?;

    let mut f = OpenOptions::new().append(true).open(name.trim())?;

    let mut input = String::new();
    io::stdin().read_line(&mut input)?;
    f.write_all(input.as_bytes())?;
    Ok(())
}

fn main() {
    match file_append() {
        Ok(()) => {
            println!("OK:file_append");
        }
        Err(e) => {
            println!("Error:{}", e);
        }
    }
}


以下のようにして追加オプションを使用してファイルを編集することができます。

let mut f = OpenOptions::new().append(true).open(name.trim())?;


もちろんオプションはこれ以外にも用意されています。
必要に応じて学んでいければいいですね。