Dizin işlemleri
- Rust kursu
- Orta seviye
- Ders 93/115
- 4 dk
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
use std::env;
use std::fs;
use std::io;
fn main() {
// buraya yaz
}Örnek çözüm
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
for giris in fs::____("veri")? {
let giris = giris?;
}
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ı |