ファイルI/O
ファイルとディレクトリの作成
ディスク上にファイルやディレクトリを作成するには時間がかかります。Tokio はこれらの 操作のノンブロッキング版を提供するため、処理が完了するまでプログラムが停止して待機する必要はありません。
File::create は新しいファイルを作成します。ファイルがすでに存在する場合は、上書きされます。
create_dir は単一のディレクトリを作成します。すでに存在する場合は失敗します。
create_dir_all はディレクトリと、そのパス上で不足している親ディレクトリを作成します。
use std::io;
use tokio::fs::File;
#[tokio::main]
async fn main() -> io::Result<()> {
// ファイルを作成する
File::create("data.txt").await?;
// 単一のディレクトリを作成する
tokio::fs::create_dir("my_dir").await?;
// ディレクトリと不足している親ディレクトリを作成する
tokio::fs::create_dir_all("my_dir/sub_dir/inner").await?;
Ok(())
}
macrosおよびfs機能を有効にして、tokioをCargo.tomlに追加してください。[dependencies] tokio = { version = "*", features = ["macros", "fs"] }
ファイルを読み込む
ディスクからファイルを読み込むには時間がかかります。Tokio はファイル読み込みのノンブロッキング版を提供しているため、プログラムはデータが返ってくるのを待つ間もほかの処理を続けられます。
readはファイルを生のバイト列として読み込みます。データを直接処理する必要がある場合に便利です。read_to_stringはファイルをプレーンテキストとして読み込みます。ファイルに可読な文字が含まれていることが分かっている場合に便利です。
use std::io;
fn process_data(data: &[u8]) {
println!("Data Length: {}", data.len());
}
#[tokio::main]
async fn main() -> io::Result<()> {
// Vec<u8> に読み込む
let content = tokio::fs::read("data.txt").await?;
process_data(&content);
// String に読み込む
let str_content = tokio::fs::read_to_string("data.txt").await?;
process_data(str_content.as_bytes());
Ok(())
}
macrosとfs機能を有効にして、Cargo.tomlにtokioを追加してください。[dependencies] tokio = { version = "*", features = ["macros", "fs"] }
ファイルの書き込み
ディスクへの書き込みには時間がかかります。tokio::fs::write は、ファイルにバイト列を書き込むためのノンブロッキングな方法です。
ファイルが存在しない場合は作成し、存在する場合は上書きします。
use std::io;
#[tokio::main]
async fn main() -> io::Result<()> {
let content = b"Generic data from program!";
tokio::fs::write("data.txt", content).await?;
Ok(())
}
macrosおよびfs機能を有効にして、Cargo.tomlにtokioを追加してください。[dependencies] tokio = { version = "*", features = ["macros", "fs"] }
ファイルとディレクトリの削除
ディスクからの削除には時間がかかります。Tokio はこれらの操作のノンブロッキング版を提供しているため、処理が完了するまでプログラムが停止して待機する必要はありません。
remove_fileは単一のファイルを削除します。remove_dirは単一のディレクトリを削除します。ディレクトリが空の場合にのみ動作します。remove_dir_allはディレクトリとその中身をすべて削除します。
use std::io;
#[tokio::main]
async fn main() -> io::Result<()> {
// ファイルを削除する
tokio::fs::remove_file("data.txt").await?;
// 空のディレクトリを削除する
tokio::fs::remove_dir("my_dir").await?;
// ディレクトリとその内容をすべて削除する
tokio::fs::remove_dir_all("my_dir").await?;
Ok(())
}
macrosおよびfs機能を有効にして、Cargo.tomlにtokioを追加してください。[dependencies] tokio = { version = "*", features = ["macros", "fs"] }
AsyncRead と AsyncWrite
AsyncRead と AsyncWrite は、Tokio におけるすべてのノンブロッキング I/O の基盤です。
ノンブロッキングで読み取りまたは書き込みができる任意の型、たとえば file、network stream、
buffer は、これらのいずれか一方または両方を実装しています。
これらの拡張である AsyncReadExt と AsyncWriteExt は、その上に便利なメソッドを追加します。
write_allは writer にバイトを書き込みます。read_to_endは reader からすべてを読み取り、buffer に格納します。copyは reader から writer へ直接データをストリームします。
use std::io;
use tokio::fs::File;
use tokio::io::{AsyncReadExt, AsyncWriteExt};
#[tokio::main]
async fn main() -> io::Result<()> {
// AsyncWrite: ファイルにバイトを書き込む
let mut file = File::create("data.txt").await?;
file.write_all(b"Generated Data!").await?;
// AsyncRead: ファイルからバイトを読み取る
let mut file = File::open("data.txt").await?;
let mut contents = Vec::new();
file.read_to_end(&mut contents).await?;
println!("Data Length: {}", contents.len());
// reader から writer へストリームする
let mut reader = File::open("data.txt").await?;
let mut writer = File::create("copy.txt").await?;
tokio::io::copy(&mut reader, &mut writer).await?;
Ok(())
}
macros、io-util、fs機能を有効にして、Cargo.tomlにtokioを追加してください。[dependencies] tokio = { version = "*", features = ["macros", "fs", "io-util"] }