Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

ファイルI/O

ファイルとディレクトリの作成

tokio-badge std-badge

ディスク上にファイルやディレクトリを作成するには時間がかかります。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 機能を有効にして、tokioCargo.toml に追加してください。

[dependencies]
tokio = { version = "*", features = ["macros", "fs"] }

ファイルを読み込む

tokio-badge std-badge

ディスクからファイルを読み込むには時間がかかります。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(())
}

macrosfs 機能を有効にして、Cargo.tomltokio を追加してください。

[dependencies]
tokio = { version = "*", features = ["macros", "fs"] }

ファイルの書き込み

tokio-badge std-badge

ディスクへの書き込みには時間がかかります。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.tomltokio を追加してください。

[dependencies]
tokio = { version = "*", features = ["macros", "fs"] }

ファイルとディレクトリの削除

tokio-badge std-badge

ディスクからの削除には時間がかかります。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.tomltokio を追加してください。

[dependencies]
tokio = { version = "*", features = ["macros", "fs"] }

AsyncRead と AsyncWrite

tokio-badge std-badge

AsyncReadAsyncWrite は、Tokio におけるすべてのノンブロッキング I/O の基盤です。
ノンブロッキングで読み取りまたは書き込みができる任意の型、たとえば filenetwork streambuffer は、これらのいずれか一方または両方を実装しています。

これらの拡張である AsyncReadExtAsyncWriteExt は、その上に便利なメソッドを追加します。

  • 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(())
}

macrosio-utilfs 機能を有効にして、Cargo.tomltokio を追加してください。

[dependencies]
tokio = { version = "*", features = ["macros", "fs", "io-util"] }