Rust: с нуля до своего органайзера Урок 49 из 55
Пути и файловая система
Урок 49. Выбрать понятное место для файла данных на разных системах.
Текст переведён с помощью ИИ.
Предварительно: рабочая папка, терминал и ошибки. Пока только составляем путь, файл не создаём.
Образ и опорная карта
Адрес на конверте говорит, где искать дом; он не гарантирует, что дом существует и что дверь открыта. Путь — адрес файла или папки в файловой системе. Текущая рабочая папка — место, от которого программа отсчитывает относительный путь. Предел образа: один и тот же относительный адрес ведёт в разные места при запуске из разных папок.
Path — заимствованный вид адреса → join — добавить имя → PathBuf — собственный адрес → проверка перед действием. Path::new("data") создаёт вид пути без выделения нового владельца; PathBuf владеет составленным путём. join("tasks.txt") добавляет компонент с учётом правил системы. std::path::{Path, PathBuf} — короткая запись двух импортов из одного модуля: фигурные скобки здесь группируют имена. is_absolute() сообщает, начинается ли адрес от корня; data/tasks.txt относителен. file_name() возвращает Option, потому что у корня или необычного пути может не быть последнего имени. В этом учебном примере оно точно есть, поэтому unwrap() допустим; для произвольного пользовательского пути обработайте None. to_string_lossy() показывает имя как текст, подменяя символы, если системное имя нельзя точно представить в UTF-8; для самих операций с файлами сохраняйте Path/PathBuf.
Составьте адрес без обращения к диску
use std::path::{Path, PathBuf};
fn main() {
let folder = Path::new("data");
let file: PathBuf = folder.join("tasks.txt");
println!("{}", file.is_absolute());
println!("{}", file.file_name().unwrap().to_string_lossy());
}
false
tasks.txt
false означает относительный путь, а последняя строка — имя файла. Мы не печатаем весь путь: разделитель каталогов различается между Windows и Unix. Путь может содержать пробелы и казахские буквы; join не требует ручного добавления разделителя.
Права доступа проверяет сама файловая операция: существующий путь может привести к PermissionDenied. Правильно составленный адрес не открывает закрытую дверь.
Вопросы для воспроизведения
- От чего отсчитывается
data/tasks.txt? - Чем
PathBufотличается отPath? - Гарантирует ли правильно составленный путь существование файла?
Задание
Обязательное. Добавьте второй путь folder.join("backup.txt") и напечатайте только имя backup.txt. Потом запустите проект из другой рабочей папки через cargo run --manifest-path ПУТЬ_К_ПРОЕКТУ/Cargo.toml: --manifest-path указывает Cargo файл проекта; cargo run запускает программу из текущей папки терминала. Сравните, откуда теперь отсчитывался бы относительный путь. Не создавайте файлы и не подставляйте путь к настоящим данным.
Ответы
Показать ответы
Повторите строку с file_name() для backup. unwrap() здесь относится только к заранее известному учебному имени.
use std::path::{Path, PathBuf};
fn main() {
let folder = Path::new("data");
let file: PathBuf = folder.join("tasks.txt");
println!("{}", file.is_absolute());
println!("{}", file.file_name().unwrap().to_string_lossy());
let backup = folder.join("backup.txt");
println!("{}", backup.file_name().unwrap().to_string_lossy());
}
false
tasks.txt
backup.txt
После проверки
При работе с реальным файлом выберите место хранения явно и покажите его пользователю. Следующий урок проверит отсутствие файла и отказ доступа как результаты ввода-вывода. Если непонятна текущая папка, вернитесь к уроку 4. Официальная документация PathBuf.
Если вы нашли ошибку или опечатку в тексте статьи, то сообщите нам об этом
Комментарии (0)
Войдите, чтобы оставить комментарий →
Пока нет комментариев. Будьте первым.