Bvural41 1
Bvural41
emirhanHCL 1
emirhanHCL
kralhakan2009 1
kralhakan2009
Vahsi Uzman 1
Vahsi Uzman
Hikaye Ekle

[NODE JS] fs.readdir ile Klasör İçeriğini Listeleme

Türkiye'de ilk Mobil & PC Aynı Anda Metin2 Oyna. Triarchonline kalıcı ve uzun ömürlü yapısı ile 24 Temmuz'da açılıyor. | 1-99 Mobil Metin2 Triarch HEMEN TIKLA!

nodejs.png


[NODE JS] fs.readdir ile Klasör İçeriğini Listeleme​


Merhaba arkadaşlar. Bugün klasör içeriğini okumayı göreceğiz. fs.readdir bir klasördeki dosya ve alt klasörleri listeler. Dosya yönetim sistemleri, arama fonksiyonları, toplu işlemler ve dosya tarayıcıları için temel fonksiyon. Ben özellikle log dosyalarını listelemek, upload klasörünü yönetmek ve dinamik modül yükleme için kullanıyorum.

readdir Kullanımı​


readdir klasörün içindeki dosya ve klasör isimlerini bir dizi olarak döndürür. Varsayılan olarak sadece isimler gelir ama withFileTypes: true seçeneğiyle Dirent nesneleri alabilirsiniz. Dirent nesnesi dosya mı klasör mü bilgisini de taşır, bu sayede ayrıca stat çağrısı yapmak gerekmez ve performans artar.

Benim en çok kullandığım pattern recursive directory traversal, yani iç içe tüm klasörleri dolaşma. Node.js 18.17'den itibaren readdir'a recursive: true seçeneği eklendi ama eski versiyonlar için kendi recursive fonksiyonunuzu yazmanız gerekir. Ben her iki yöntemi de göstereceğim.

JavaScript:
// === fs.readdir ile KLASÖR LİSTELEME ===

const fs = require('fs');
const path = require('path');

// Test yapısı oluştur
const testDir = path.join(__dirname, 'test-readdir');
const yapı = [
    'belgeler/rapor.txt',
    'belgeler/sunum.pptx',
    'resimler/foto1.jpg',
    'resimler/foto2.png',
    'resimler/albüm/deniz.jpg',
    'kod/app.js',
    'kod/utils.js',
    'kod/lib/helper.js',
    'notlar.txt',
    'config.json'
];

// Test yapısını oluştur
yapı.forEach(dosya => {
    const tamYol = path.join(testDir, dosya);
    fs.mkdirSync(path.dirname(tamYol), { recursive: true });
    fs.writeFileSync(tamYol, `İçerik: ${dosya}`, 'utf-8');
});

// 1. Temel readdir
console.log('=== Temel readdir ===');
const icerik = fs.readdirSync(testDir);
console.log('İçerik:', icerik);
// ['belgeler', 'kod', 'config.json', 'notlar.txt', 'resimler']

// 2. withFileTypes ile (dosya/klasör ayrımı)
console.log('\n=== withFileTypes ===');
const girisler = fs.readdirSync(testDir, { withFileTypes: true });
girisler.forEach(giris => {
    const tip = giris.isDirectory() ? '[KLASÖR]' : '[DOSYA ]';
    console.log(`  ${tip} ${giris.name}`);
});

// 3. Detaylı listeleme (stat ile)
async function detayliListele(dizin) {
    const dosyalar = await fs.promises.readdir(dizin);
    const detaylar = [];

    for (const dosya of dosyalar) {
        const tamYol = path.join(dizin, dosya);
        const stat = await fs.promises.stat(tamYol);

        detaylar.push({
            isim: dosya,
            tip: stat.isDirectory() ? 'Klasör' : 'Dosya',
            boyut: stat.isFile() ? `${stat.size} B` : '-',
            degistirilme: stat.mtime.toLocaleDateString('tr-TR'),
            uzanti: stat.isFile() ? path.extname(dosya) : '-'
        });
    }

    return detaylar;
}

detayliListele(testDir).then(detaylar => {
    console.log('\n=== Detaylı Liste ===');
    console.table(detaylar);
});

// 4. Recursive listeleme (iç içe tüm dosyalar)
function recursiveListele(dizin, prefix = '') {
    const sonuc = [];
    const girisler = fs.readdirSync(dizin, { withFileTypes: true });

    for (const giris of girisler) {
        const tamYol = path.join(dizin, giris.name);
        const goreceliYol = prefix ? `${prefix}/${giris.name}` : giris.name;

        if (giris.isDirectory()) {
            console.log(`${' '.repeat(prefix.split('/').length * 2)}📁 ${giris.name}/`);
            sonuc.push(...recursiveListele(tamYol, goreceliYol));
        } else {
            console.log(`${' '.repeat(prefix.split('/').length * 2)}📄 ${giris.name}`);
            sonuc.push(goreceliYol);
        }
    }

    return sonuc;
}

console.log('\n=== Recursive Listeleme ===');
const tumDosyalar = recursiveListele(testDir);
console.log(`\nToplam ${tumDosyalar.length} dosya`);

// 5. Filtreleme ve arama
function dosyaAra(dizin, aramaKriteri) {
    const sonuclar = [];

    function tara(dir) {
        const girisler = fs.readdirSync(dir, { withFileTypes: true });

        for (const giris of girisler) {
            const tamYol = path.join(dir, giris.name);

            if (giris.isDirectory()) {
                tara(tamYol);
            } else if (aramaKriteri(giris.name, tamYol)) {
                sonuclar.push(tamYol);
            }
        }
    }

    tara(dizin);
    return sonuclar;
}

// Uzantıya göre arama
const jpgDosyalar = dosyaAra(testDir, (ad) => ad.endsWith('.jpg'));
console.log('\nJPG dosyalar:', jpgDosyalar.map(d => path.relative(testDir, d)));

const jsDosyalar = dosyaAra(testDir, (ad) => ad.endsWith('.js'));
console.log('JS dosyalar:', jsDosyalar.map(d => path.relative(testDir, d)));

// Temizlik
fs.rmSync(testDir, { recursive: true, force: true });

readdir dosya sistemiyle çalışmanın temelidir. withFileTypes ile performanslı listeleme yapın, büyük dizinlerde stream kullanmayı düşünün ve recursive taramada sembolik link döngülerine dikkat edin. Kolay gelsin.
 

Şu an konuyu görüntüleyenler (Toplam : 0, Üye: 0, Misafir: 0)

Geri
Üst