상세 컨텐츠

본문 제목

24. Rust 파일 읽기 및 쓰기

Rust를 처음부터 배우세요

by 러스트코리아 2024. 12. 22. 01:46

본문

반응형

Rust 표준 라이브러리는 파일을 읽고 쓰기 위한 수많은 모듈과 메서드를 제공합니다.

Rust 언어는 File 구조를 사용하여 파일을 설명/표시합니다.

File 구조에는 프로그램이 파일에 대해 수행할 수 있는 특정 작업과 사용 가능한 작업 방법을 나타내는 데 사용되는 관련 멤버 변수 또는 함수가 있습니다.

File 구조 의 모든 작업 메서드는 Result 열거형을 반환합니다 .

다음 표에는 일반적으로 사용되는 파일 읽기 및 쓰기 방법이 나열되어 있습니다.

 기준 코드 메소드 설명
std::fs::File open() / pub fn open(path: P) -> Result 읽기 전용 모드로 파일을 여는 정적 메서드
std::fs::File create() / pub fn create(path: P) -> Result 쓰기 가능 모드로 파일을 여는 정적 메서드입니다. 파일이 존재하는 경우 이전 내용을 지우십시오. 파일이 없으면 새 파일을 만듭니다.
std::fs::remove_file remove_file() / pub fn remove_file(path: P) -> Result<()> 파일 시스템에서 파일 삭제
std::fs::OpenOptions append() / pub fn append(&mut self, append: bool) -> &mut OpenOptions 추가할 파일 모드 설정
std::io::Writes write_all() / fn write_all(&mut self, buf: &[u8]) -> Result<()> buf의 모든 내용을 출력 스트림에 씁니다.
std::io::Read read_to_string() / fn read_to_string(&mut self, buf: &mut String) -> Result 모든 내용을 읽고 문자열로 변환하여 buf에 추가합니다.

24.1 러스트에서 파일 열기

Rust 표준 라이브러리의 std::fs::File 모듈은 파일을 열고 파일 핸들을 반환하기 위한 정적 메서드 open()을 제공합니다.

open() 함수의 프로토타입은 다음과 같습니다.

  1. pub fn open(path: P) -> Result

open() 함수는 읽기 전용 모드로 기존 파일을 여는 데 사용됩니다. 파일이 존재하지 않으면 오류가 발생합니다. 파일을 읽을 수 없는 경우에도 오류가 발생합니다.

24.1.1 예

다음 예에서는 open()을 사용하여 현재 디렉터리에 있는 파일을 엽니다. 따라서 오류가 발생하지 않습니다.

  1. fn main() {
  2. let file = std::fs::File::open("data.txt").unwrap();
  3. println!("파일이 열렸습니다.:{:?}",file);
  4. }

위의 Rust 코드를 컴파일하고 실행하면 출력 결과는 다음과 같습니다.

  1. 파일이  열렸습니다.:File { fd: 3, path: "/Users/Admin/Downloads/guess-game-app/src/data.txt", read: true, write: false }

data.txt 파일이 없으면 다음 오류가 발생합니다.

  1. thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: Os { code: 2, kind: NotFound, message: "No such file or directory" }', src/libcore/result.rs:997:5
  2. note: Run with `RUST_BACKTRACE=1` environment variable to display a backtrace.

24.2 러스트 생성 파일

Rust 표준 라이브러리의 std::fs::File 모듈은 파일을 생성하고 생성된 파일 핸들을 반환하기 위한 정적 메서드 create()를 제공합니다.

create() 함수의 프로토타입은 다음과 같습니다.

  1. pub fn create(path: P) -> Result

create() 함수는 파일을 생성하고 생성된 파일 핸들을 반환합니다. 파일이 이미 존재하는 경우 내부적으로 open()이 호출되어 파일을 엽니다. 예를 들어 디렉터리에 쓸 수 없는 등 생성이 실패하면 오류가 발생합니다.

24.2.1 예

다음 코드는 create() 함수를 사용하여 data.txt 파일을 생성합니다.

  1. fn main() {
  2. let file = std::fs::File::create("data.txt").expect("create failed");
  3. println!("파일이 생성되었습니다..:{:?}",file);
  4. }

위의 Rust 코드를 컴파일하고 실행하면 출력 결과는 다음과 같습니다.

  1. 파일이 생성되었습니다.:File { fd: 3, path: "/Users/Admin/Downloads/guess-game-app/src/data.txt", read: false, write: true }

24.3 Rust 파일에 쓰기

Rust 언어 표준 라이브러리 std::io::Writes는 출력 스트림에 콘텐츠를 쓰기 위한 write_all() 함수를 제공합니다.

파일 스트림도 출력 스트림의 한 유형이기 때문에 이 함수를 사용하여 파일에 콘텐츠를 쓸 수도 있습니다.

write_all() 함수는 std::io::Writes 모듈에 정의되어 있으며 해당 함수 프로토타입은 다음과 같습니다.

  1. fn write_all(&mut self, buf: &[u8]) -> Result<()>

write_all()은 buf의 내용을 현재 스트림에 쓰는 데 사용됩니다. 쓰기가 성공하면 쓰여진 바이트 수를 반환하고, 쓰기가 실패하면 오류를 발생시킵니다.

24.3.1 예

다음 코드에서는 write_all() 메서드를 사용하여 data.txt 파일에 일부 내용을 씁니다.

  1. use std::io::Write;
  2. fn main() {
  3. let mut file = std::fs::File::create("data.txt").expect("create failed");
  4. file.write_all("처음부터 시작하는 방법에 대한 튜토리얼".as_bytes()).expect("write failed");
  5. file.write_all("\n간단한 프로그래밍".as_bytes()).expect("write failed");
  6. println!("data written to file" );
  7. }

위의 Rust 예제를 컴파일하고 실행하면 출력 결과는 다음과 같습니다.

  1. 처음부터 시작하는 방법에 대한 튜토리얼
  2. 간단한 프로그래밍

참고: write_all() 메서드는 쓰기 후에 자동으로 개행 문자를\n 쓰지 ​​않습니다.

24.4 러스트에서 파일 읽기

Rust에서 콘텐츠를 읽는 일반적인 단계는 다음과 같습니다.

  1. open() 함수를 사용하여 파일 열기
  2. 그런 다음 read_to_string() 함수를 사용하여 파일의 모든 내용을 읽고 이를 문자열로 변환합니다.

이전에 open() 함수에 대해 소개한 적이 있습니다. 이번에는 read_to_string() 함수에 대해 주로 이야기하겠습니다.

read_to_string() 함수는 파일에서 나머지 모든 내용을 읽고 이를 문자열로 변환하는 데 사용됩니다.

read_to_string() 함수의 프로토타입은 다음과 같습니다

  1. fn read_to_string(&mut self, buf: &mut String) -> Result

read_to_string() 함수는 파일의 모든 내용을 읽고 버퍼에 추가하는 데 사용됩니다. 읽기에 성공하면 읽은 바이트 수를 반환합니다.

24.4.1 예

먼저 현재 디렉터리에 data.txt라는 새 파일을 만들고 다음 내용을 작성합니다.

  1. 처음부터 시작하는 방법에 대한 튜토리얼
  2. 간단한 프로그래밍

그런 다음 read_to_string 함수를 사용하여 파일에서 내용을 읽는 작은 예제를 작성합니다.

  1. use std::io::Read;
  2.  
  3. fn main(){
  4. let mut file = std::fs::File::open("data.txt").unwrap();
  5. let mut contents = String::new();
  6. file.read_to_string(&mut contents).unwrap();
  7. print!("{}", contents);
  8. }

위의 Rust 코드를 컴파일하고 실행하면 출력 결과는 다음과 같습니다.

  1. 처음부터 시작하는 방법에 대한 튜토리얼
  2. 간단한 프로그래밍

24.5 파일 끝에 내용을 추가하세요

Rust 코어와 표준 라이브러리는 파일 끝에 콘텐츠를 추가하는 직접적인 기능을 제공하지 않습니다.

그러나 파일의 열기 모드를 추가로 설정하기 위해append() 함수가 제공됩니다.

파일 모드가 추가로 설정된 경우 파일에 기록된 콘텐츠는 원래 이전 콘텐츠를 대체하지 않고 이전 콘텐츠 뒤에 배치됩니다.

add() 함수는 std::fs::OpenOptions 모듈에 정의되어 있으며 해당 함수 프로토타입은 다음과 같습니다.

  1. pub fn append(&mut self, append: bool) -> &mut OpenOptions

24.5.1 예

다음 예제에서는 Append() 메서드를 사용하여 파일 열기 모드를 추가로 변경합니다.

  1. use std::fs::OpenOptions;
  2. use std::io::Write;
  3.  
  4. fn main() {
  5. let mut file = OpenOptions::new().append(true).open("data.txt").expect(
  6. "cannot open file");
  7. file.write_all("www.naver.com".as_bytes()).expect("write failed");
  8. file.write_all("\n처음부터 시작하는 방법에 대한 튜토리얼".as_bytes()).expect("write failed");
  9. file.write_all("\n간단한프로그래밍".as_bytes()).expect("write failed");
  10. println!("데이터가 추가되었습니다.");
  11. }

위의 Rust 코드를 컴파일하고 실행하면 출력 결과는 다음과 같습니다.

  1. 데이터가 추가되었습니다.

data.txt 파일을 열면 다음 내용을 볼 수 있습니다.

  1. 처음부터 시작하는 방법에 대한 튜토리얼
  2. 간단한프로그래밍www.naver.com
  3. 처음부터 시작하는 방법에 대한 튜토리얼
  4. 간단한프로그래밍

24.6 Rust 파일 삭제

Rust 표준 라이브러리 std::fs는 파일 삭제를 위한 Remove_file() 함수를 제공합니다.

Remove_file() 함수의 프로토타입은 다음과 같습니다.

  1. pub fn remove_file<P: AsRef>(path: P) -> Result<()>

삭제에 실패할 수 있으며, 반환 결과가 양호하더라도 즉시 삭제되지 않을 수 있으니 주의하시기 바랍니다.

24.6.1 예

아래 코드에서는 Remove_file() 메서드를 사용하여 data.txt를 삭제합니다.

Expect() 메소드는 삭제 오류가 발생할 때 사용자 정의 오류 메시지를 출력하는 데 사용됩니다.

  1. use std::fs;
  2. fn main() {
  3. fs::remove_file("data.txt").expect("could not remove file");
  4. println!("file is removed");
  5. }

위의 예제를 컴파일하고 실행하면 출력 결과는 다음과 같습니다.

  1. file is removed

현재 디렉터리를 열면 파일이 삭제된 것을 확인할 수 있습니다.

24.7 Rust 파일 복사하기

Rust 표준 라이브러리는 파일을 새 파일로 복사하는 기능을 제공하지 않습니다.

그러나 위에서 언급한 기능과 방법을 사용하여 파일 복사 기능을 실현할 수 있습니다.

아래 코드에서는 복사 명령의 간단한 버전을 모방합니다.

  1. copy old_file_name new_file_name

구체적인 Rust 코드는 다음과 같습니다

  1. use std::io::Read;
  2. use std::io::Write;
  3.  
  4. fn main() {
  5. let mut command_line: std::env::Args = std::env::args();
  6. command_line.next().unwrap();
  7.  
  8. // 프로그램 이름 건너뛰기
  9. // 원본 파일
  10. let source = command_line.next().unwrap();
  11.  
  12. // 새 파일
  13. let destination = command_line.next().unwrap();
  14. let mut file_in = std::fs::File::open(source).unwrap();
  15. let mut file_out = std::fs::File::create(destination).unwrap();
  16. let mut buffer = [0u8; 4096];
  17. loop {
  18. let nbytes = file_in.read(&mut buffer).unwrap();
  19. file_out.write(&buffer[..nbytes]).unwrap();
  20. if nbytes < buffer.len() { break; }
  21. }
  22. }

먼저 위의 코드를 컴파일하세요.

  1. $ rustc main.rs

그런 다음 다음 명령을 사용하여 실행하십시오.

윈도우 컴퓨터

  1. $ ./main.exe data.txt data_new.txt

리눅스/맥 컴퓨터

  1. $ ./main data.txt data_new.txt

data.txt는 복사하려는 원본 파일 경로입니다. data_new.txt는 원하는 새 파일 경로입니다.

현재 콘텐츠 저작권은 chapin666 또는 그 계열사에 있습니다.
반응형

'Rust를 처음부터 배우세요' 카테고리의 다른 글

25. Rust Cargo 패키지 관리자  (0) 2024.12.22
23. Rust IO  (0) 2024.12.21
22. Rust 제네릭  (0) 2024.12.21
21. Rust 오류 처리  (0) 2024.12.21
20. Rust 컬렉션  (0) 2024.12.14

관련글 더보기