Özet - Dosya I/O
- Rust kursu
- Orta seviye
- Ders 94/115
- 5 dk
read_to_string ve write'ı birleştirerek bir log dosyası işleyici yazarsın.
Dosya I/O özeti
Okuma: fs::read_to_string (tamamı), BufReader::lines (satır satır), fs::read (baytlar). Yazma: fs::write (ezer), File::create + writeln!, BufWriter (toplu), OpenOptions ile append. Dizinler: create_dir_all, read_dir, remove_dir_all. Tüm işlemler io::Result döndürür; e.kind() ile hata türü (NotFound, PermissionDenied) ayırt edilir.
Kaydet ve yükle
Not defteri projesinin kalıcılığı için iki küçük fonksiyon yeterlidir:
fn kaydet(yol: &Path, notlar: &[&str]) -> io::Result<()> {
fs::write(yol, notlar.join("\n"))
}
fn yukle(yol: &Path) -> io::Result<Vec<String>> {
Ok(fs::read_to_string(yol)?.lines().map(String::from).collect())
}Bir sonraki adımda düz metin yerine JSON kullanıp yapılı veriyi serde ile saklayacağız.
Uygulama Kalıcı notlar
Yukarıdaki kaydet ve yukle fonksiyonlarını yaz. Geçici klasörde ["süt al", "kod yaz"] notlarını kaydedip geri yükle ve {:?} ile yazdır. Ardından var olmayan bir dosyayı okumayı dene; NotFound ise bulunamadı yazdır.
Başlangıç kodu
use std::env;
use std::fs;
use std::io::{self, ErrorKind};
use std::path::Path;
fn main() {
// buraya yaz
}Örnek çözüm
use std::env;
use std::fs;
use std::io::{self, ErrorKind};
use std::path::Path;
fn kaydet(yol: &Path, notlar: &[&str]) -> io::Result<()> {
fs::write(yol, notlar.join("\n"))
}
fn yukle(yol: &Path) -> io::Result<Vec<String>> {
Ok(fs::read_to_string(yol)?.lines().map(String::from).collect())
}
fn main() -> io::Result<()> {
let yol = env::temp_dir().join("notlar_ders.txt");
kaydet(&yol, &["süt al", "kod yaz"])?;
println!("{:?}", yukle(&yol)?);
match fs::read_to_string(env::temp_dir().join("hic_yok_12345.txt")) {
Err(e) if e.kind() == ErrorKind::NotFound => println!("bulunamadı"),
Err(e) => return Err(e),
Ok(_) => println!("var"),
}
Ok(())
}Beklenen çıktı
["süt al", "kod yaz"] bulunamadı
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Ayar dosyası yoksa varsayılanlarla devam etmek için hangi kalıp uygundur?
- Her hatada varsayılan
- panic!
- Err(e) if e.kind() == ErrorKind::NotFound => varsayılan Doğru cevap
- unwrap()
Açıklama: Yalnızca "dosya yok" durumunu yut; izin hatası gibi diğer hatalar kullanıcıya bildirilmeli.
2 Hata türü
Err(e) if e.____() == ErrorKind::NotFound => Vec::new(),
Err(e) if e.kind() == ErrorKind::NotFound => Vec::new(),
Açıklama: io::Error::kind() hatanın türünü verir.
3 Grubun özeti
| Kavram | Anlamı |
|---|---|
read_to_string |
Tümünü oku |
BufReader::lines |
Satır satır |
OpenOptions::append |
Sona ekle |
ErrorKind::NotFound |
Dosya yok |