#io #file-descriptor #file-io #unix #unix-socket #file #stdio

stdio-override

Rust库,用于使用不同的文件描述符覆盖Stdin/Stdout/Stderr

4个版本

0.1.3 2019年5月2日
0.1.2 2019年5月2日
0.1.1 2019年5月2日
0.1.0 2019年5月1日

#867 in Unix API

Download history 799/week @ 2024-03-14 720/week @ 2024-03-21 730/week @ 2024-03-28 564/week @ 2024-04-04 519/week @ 2024-04-11 697/week @ 2024-04-18 560/week @ 2024-04-25 782/week @ 2024-05-02 768/week @ 2024-05-09 671/week @ 2024-05-16 633/week @ 2024-05-23 678/week @ 2024-05-30 512/week @ 2024-06-06 497/week @ 2024-06-13 568/week @ 2024-06-20 449/week @ 2024-06-27

每月 2,155 次下载
用于 4 crates

MIT/Apache

15KB
168 代码行

stdio-override

Build Status Latest version Documentation License

一个Rust库,用于轻松覆盖Rust中的Stdio文件描述符

用法

将其添加到您的 Cargo.toml

[dependencies]
stdio-override = "0.1"

对于Rust Edition 2015,请将以下内容添加到您的crate根目录

extern crate stdio_override;

Rust Edition 2018中,您可以直接这样做

use stdio_override::*;

以下是一个将stdout写入文件的示例

use std::{fs::read_to_string, io};
use stdio_override::StdoutOverride;

fn main() -> io::Result<()> {
    let file_name = "./readme_test.txt";

    let guard = StdoutOverride::override_file(file_name)?;
    println!("12345");
    drop(guard);

    let contents = read_to_string(file_name)?;
    assert_eq!("12345\n", contents);
    println!("Outside!");
    Ok(())
}

您可以使用相同的方式处理套接字

use std::{
    io::Read,
    net::{TcpListener, TcpStream},
};
use stdio_override::StdoutOverride;

fn main() {
    let address = ("127.0.0.1", 5543);

    let listener = TcpListener::bind(address).unwrap();
    let socket = TcpStream::connect(address).unwrap();

    let guard = StdoutOverride::override_raw(socket).unwrap();
    println!("12345");
    drop(guard);

    let mut contents = String::new();
    let (mut stream, _) = listener.accept().unwrap();
    stream.read_to_string(&mut contents).unwrap();

    assert_eq!("12345\n", contents);

    println!("Outside!");
}

两者都将对Stderr起作用,如果您想从文件/套接字读取Stdin,可以执行以下操作

use std::{fs::{File, read_to_string}, io::{self, Write}};
use stdio_override::StdinOverride;

fn main() -> io::Result<()> {
    let file_name = "./test_inputs.txt";
    
    {
        let mut file = File::create(&file_name)?;
        file.write_all(b"Data")?;
    }

    let guard = StdinOverride::override_file(file_name)?;
    
    let mut inputs = String::new();
    io::stdin().read_line(&mut inputs)?;
    
    drop(guard);

    assert_eq!("Data", inputs);
    // Stdin is working as usual again, because the guard is dropped.
    Ok(())
}

依赖项

~45KB