Rust
Özet - Dosya I/O
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.
Örnek çözümü göster
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(())
}
Kendini test et
-
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
- unwrap()
Cevabı göster
Err(e) if e.kind() == ErrorKind::NotFound => varsayılan — Yalnızca "dosya yok" durumunu yut; izin hatası gibi diğer hatalar kullanıcıya bildirilmeli.
-
Hata türü
Err(e) if e.____() == ErrorKind::NotFound => Vec::new(),
Cevabı göster
Err(e) if e.kind() == ErrorKind::NotFound => Vec::new(),
-
Grubun özeti
- read_to_string
- Tümünü oku
- BufReader::lines
- Satır satır
- OpenOptions::append
- Sona ekle
- ErrorKind::NotFound
- Dosya yok
Sıradaki ders: clap tanımı