CodeBlanks Logo Icon CodeBlanks

Dizin işlemleri

read_dir ile dizin içeriğini listelemeyi öğrenirsin.

Dizin işlemleri

Klasör oluşturmak, listelemek ve silmek için std::fs fonksiyonları kullanılır. read_dir, her biri io::Result<DirEntry> olan bir yineleyici döndürür:

fs::create_dir_all("veri/2024")?;     // ara klasörleri de oluşturur
for giris in fs::read_dir("veri")? {
    let giris = giris?;
    println!("{:?} {}", giris.file_name(), giris.path().is_dir());
}

read_dir girdileri belirli bir sırayla vermez; sıra gerekiyorsa adlar toplanıp sıralanmalıdır.

Uzantıya göre süzmek

Path yöntemleri, yolları metin işlemine gerek kalmadan parçalar:

let yol = std::path::Path::new("veri/rapor.txt");
println!("{:?}", yol.file_name());   // Some("rapor.txt")
println!("{:?}", yol.extension());   // Some("txt")
println!("{:?}", yol.parent());      // Some("veri")
println!("{}", yol.exists());

extension() bir Option<&OsStr> döndürür; karşılaştırmak için == Some(OsStr::new("txt")) ya da .and_then(|e| e.to_str()) kullanılır.

Uygulama Klasör içeriği

Geçici klasörde rust_ders_klasor adlı bir klasör oluştur (create_dir_all) ve içine b.txt ile a.txt yaz. read_dir ile dosya adlarını Vec<String>'e topla, sırala ve yazdır.

Başlangıç kodu

main.rs
use std::env;
use std::fs;
use std::io;

fn main() {
    // buraya yaz
}

Örnek çözüm

main.rs
use std::env;
use std::fs;
use std::io;

fn main() -> io::Result<()> {
    let klasor = env::temp_dir().join("rust_ders_klasor");
    fs::create_dir_all(&klasor)?;
    fs::write(klasor.join("b.txt"), "2")?;
    fs::write(klasor.join("a.txt"), "1")?;
    let mut adlar = Vec::new();
    for giris in fs::read_dir(&klasor)? {
        let giris = giris?;
        adlar.push(giris.file_name().to_string_lossy().into_owned());
    }
    adlar.sort();
    println!("{:?}", adlar);
    Ok(())
}

Beklenen çıktı

["a.txt", "b.txt"]

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 <code>fs::remove_dir</code> ile <code>fs::remove_dir_all</code> farkı nedir?

  • Fark yok
  • remove_dir_all çöp kutusuna taşır
  • remove_dir dosya siler
  • remove_dir yalnızca boş klasörü siler; remove_dir_all içeriğiyle birlikte siler Doğru cevap

Açıklama: remove_dir_all geri alınamaz; kullanmadan önce yolu iki kez denetle.

2 Klasörü listele

Soru
for giris in fs::____("veri")? {
    let giris = giris?;
}
Cevap
for giris in fs::read_dir("veri")? {
    let giris = giris?;
}

Açıklama: read_dir klasördeki girdileri DirEntry olarak verir.

3 Fonksiyon ve işi

Kavram Anlamı
create_dir_all Ara klasörlerle oluşturur
read_dir Girdileri listeler
remove_dir_all İçerikle siler
Path::extension Dosya uzantısı

Orta seviye bölümündeki tüm dersler