Skip to content

File IOのやり方

通常(同期処理)のFile I/O

ファイルを作成する

use std::fs::File;
use std::io::Result;
fn main() -> Result<()> {
let f = File::open("test.txt")?;
dbg!("{:?}", f);
Ok(())
}

(既存の)ファイルを開く

use std::fs::File;
use std::io::Result;
fn main() -> Result<()> {
let f = File::open("test.txt")?;
dbg!("{:?}", f);
Ok(())
}

これをcargo runで実行するとこのようになる。

Terminal window
Finished dev [unoptimized + debuginfo] target(s) in 0.00s
Running `target/debug/rust-fileio-sample`
[src/main.rs:7:5] "{:?}" = "{:?}"
[src/main.rs:7:5] f = File {
fd: 3,
path: "/Users/koralle/sandbox/rust-fileio-sample/test.txt",
read: true,
write: false,
}

tokioを使った非同期処理のFile I/O

tokioを依存関係に追加する。

Terminal window
cargo add tokio --features="full"

ファイルを作成する

その後、こう書けばいい。

use tokio::fs::File;
use tokio::io::Result;
#[tokio::main]
async fn main() -> Result<()> {
let f = File::create("test.txt").await?;
dbg!("{:?}", f);
Ok(())
}

ファイルを読み出す

ファイルを読み出すにはtokio::io::AsyncReadExtトレイトをスコープに入れる事に注意する。

use tokio::fs::File;
use tokio::io::{Result, AsyncReadExt};
#[tokio::main]
async fn main() -> Result<()> {
let mut f = File::open("test.txt").await?;
let mut buf = Vec::new();
f.read_to_end(&mut buf).await?;
dbg!("{:?}", buf);
Ok(())
}

ファイルに書き出す

ファイルを読み出すにはtokio::io::AsyncWriteExtトレイトをスコープに入れる事に注意する。

use tokio::fs::File;
use tokio::io::{Result, AsyncWriteExt};
#[tokio::main]
async fn main() -> Result<()> {
let mut f = File::create("test.txt").await?;
let message = f.write(b"!!!!!!").await?;
dbg!("{}", message);
Ok(())
}