Выбрать главу

Some(s) => println!("новый путь {}", s),

}

}

הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Не забудьте проверить остальные методы Path (posix::Path или windows::Path) и структуры Metadata.

OsStr и Metadata.

Структура File представляет открытый файл (она является обёрткой над файловым дескриптором) и даёт возможность чтения/записи этого файла.

Из-за того, что многие вещи могут пойти не так в процессе файлового ввода-вывода, все методы File возвращают тип io::Result<T>, который является псевдонимом для Result<T, io::Error>.

Это делает явными ошибки всех операций ввода-вывода. Благодаря этому, программист может увидеть все пути отказов и обрабатывать их упреждающей форме.

Статический метод open может использоваться для открытия файла в режиме только для чтения.

Структура File владеет ресурсом, файловым дескриптором, и заботится о том, чтобы он был закрыт, когда структура удаляется из памяти.

use std::fs::File;

use std::io::prelude::*;

use std::path::Path;

fn main() {

// Создадим "путь" к нужному файлу

let path = Path::new("hello.txt");

let display = path.display();

// Откроем "путь" в режиме "только чтение". Возвращается `io::Result<File>`

let mut file = match File::open(&path) {

Err(why) => panic!("невозможно открыть {}: {}", display, why),

Ok(file) => file,

};

// Читаем содержимое файла в строку. Метод возвращает `io::Result<usize>`

let mut s = String::new();

match file.read_to_string(&mut s) {

Err(why) => panic!("невозможно прочесть {}: {}", display, why),

Ok(_) => print!("{} содержит:\n{}", display, s),

}

// `file` выходит из области видимости и файл "hello.txt" закрывается

}

הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Вот ожидаемый результат:

$ echo "Hello World!" > hello.txt

$ rustc open.rs && ./open

hello.txt содержит:

Hello World!

(Рекомендуем протестировать предыдущий пример при различных условиях сбоев: файл hello.txt не существует или hello.txt не читаемый и другое)

Статический метод create открывает файл в режиме только для записи. Если файл уже существует, то его содержимое уничтожится, в противном же случае, создастся новый файл.

static LOREM_IPSUM: &str =

"Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod

tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,

quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo

consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse

cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non

proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

";

use std::fs::File;

use std::io::prelude::*;

use std::path::Path;

fn main() {

let path = Path::new("out/lorem_ipsum.txt");

let display = path.display();

// Откроем файл в режиме для записи. Возвращается `io::Result<File>`

let mut file = match File::create(&path) {

Err(why) => panic!("невозможно создать {}: {}", display, why),

Ok(file) => file,

};

// Запишем строку `LOREM_IPSUM` в `file`. Возвращается `io::Result<()>`

match file.write_all(LOREM_IPSUM.as_bytes()) {

Err(why) => panic!("невозможно записать в {}: {}", display, why),

Ok(_) => println!("успешно записано в {}", display),

}

}

Вот расширенный ожидаемый результат:

$ rustc create.rs && ./create

successfully wrote to lorem_ipsum.txt

$ cat lorem_ipsum.txt