emirhanHCL 1
emirhanHCL
kralhakan2009 1
kralhakan2009
Vahsi Uzman 1
Vahsi Uzman
farkmt2official 1
farkmt2official
mannaxxx 1
mannaxxx
Bvural41 1
Bvural41
Agora Metin2 1
Agora Metin2
berkmenoo 1
berkmenoo
Hikaye Ekle

[NODE JS] fs.readFile ile Dosya Okuma

nodejs.png


[NODE JS] fs.readFile ile Dosya Okuma​


Selam arkadaşlar. Node.js'in en çok kullanılan modüllerinden biri olan fs modülüyle dosya işlemlerine başlıyoruz. Bugünkü konumuz dosya okuma. fs.readFile ve fs.readFileSync ile dosya okumak Node.js'te en temel yeteneklerden biri. Ben backend geliştirirken her gün dosya okuma işlemleri yapıyorum: konfigürasyon dosyaları, şablonlar, log dosyaları, yüklenen dosyalar ve benzeri pek çok senaryo var.

Senkron ve Asenkron Dosya Okuma​


Node.js'te dosya okuma iki şekilde yapılır: senkron (readFileSync) ve asenkron (readFile). Senkron okuma programı bloklar, yani dosya okunana kadar başka hiçbir iş yapılmaz. Asenkron okuma ise arka planda çalışır ve okunma tamamlandığında callback fonksiyonunu çağırır. Production'da genellikle asenkron tercih edilir ama uygulama başlangıcında konfigürasyon okumak gibi durumlarda senkron kullanmak sorun yaratmaz.

Tecrübeme göre en yaygın hata encoding belirtmemek. Encoding parametresi vermezseniz Buffer döner, string almak için 'utf-8' belirtmeniz gerekir. Bu detayı bilmeyen geliştiricilerin başına geldiğini çok gördüm.

JavaScript:
// === fs.readFile ile DOSYA OKUMA ===

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

// Test dosyası oluşturalım önce
const testDosyasi = path.join(__dirname, 'test-okuma.txt');
fs.writeFileSync(testDosyasi, 'Merhaba Node.js!\nBu bir test dosyasıdır.\nÜçüncü satır.', 'utf-8');

// 1. Senkron okuma (readFileSync)
console.log('=== Senkron Okuma ===');
try {
    // Encoding belirtilmezse Buffer döner
    const buffer = fs.readFileSync(testDosyasi);
    console.log('Buffer:', buffer);
    console.log('Tip:', typeof buffer); // object

    // Encoding ile string döner
    const icerik = fs.readFileSync(testDosyasi, 'utf-8');
    console.log('String:', icerik);
    console.log('Tip:', typeof icerik); // string
} catch (hata) {
    console.error('Okuma hatası:', hata.message);
}

// 2. Asenkron okuma - Callback
console.log('\n=== Asenkron Okuma (Callback) ===');
fs.readFile(testDosyasi, 'utf-8', (hata, icerik) => {
    if (hata) {
        console.error('Hata:', hata.message);
        return;
    }
    console.log('Callback ile:', icerik);
});

// 3. Asenkron okuma - Promise (fs.promises)
console.log('\n=== Asenkron Okuma (Promise) ===');
const fsPromise = require('fs').promises;

async function dosyaOkuPromise() {
    try {
        const icerik = await fsPromise.readFile(testDosyasi, 'utf-8');
        console.log('Promise ile:', icerik);
    } catch (hata) {
        console.error('Promise hatası:', hata.message);
    }
}
dosyaOkuPromise();

// 4. JSON dosyası okuma
const jsonDosyasi = path.join(__dirname, 'test-config.json');
fs.writeFileSync(jsonDosyasi, JSON.stringify({
    sunucu: { port: 3000, host: 'localhost' },
    veritabani: { url: 'mongodb://localhost:27017/test' },
    debug: true
}, null, 2));

function configOku() {
    try {
        const ham = fs.readFileSync(jsonDosyasi, 'utf-8');
        const config = JSON.parse(ham);
        console.log('\nConfig:', config);
        console.log('Port:', config.sunucu.port);
        return config;
    } catch (hata) {
        if (hata.code === 'ENOENT') {
            console.error('Config dosyası bulunamadı!');
        } else if (hata instanceof SyntaxError) {
            console.error('Config dosyası geçersiz JSON!');
        } else {
            console.error('Beklenmeyen hata:', hata.message);
        }
        return null;
    }
}
configOku();

// 5. Satır satır okuma
function satirSatirOku(dosyaYolu) {
    const icerik = fs.readFileSync(dosyaYolu, 'utf-8');
    const satirlar = icerik.split('\n');

    console.log(`\nToplam ${satirlar.length} satır:`);
    satirlar.forEach((satir, index) => {
        console.log(`  ${index + 1}: ${satir}`);
    });

    return satirlar;
}
satirSatirOku(testDosyasi);

// 6. Büyük dosyalar için stream okuma
const { createReadStream } = require('fs');
const { createInterface } = require('readline');

async function buyukDosyaOku(dosyaYolu) {
    const stream = createReadStream(dosyaYolu, 'utf-8');
    const rl = createInterface({ input: stream });
    let satirSayisi = 0;

    for await (const satir of rl) {
        satirSayisi++;
        // Her satırı işle
    }
    console.log(`\nStream ile ${satirSayisi} satır okundu`);
}
buyukDosyaOku(testDosyasi);

// Temizlik
setTimeout(() => {
    fs.unlinkSync(testDosyasi);
    fs.unlinkSync(jsonDosyasi);
}, 1000);

Hata Yönetimi ve En İyi Pratikler​


Dosya okuma işlemlerinde hata yönetimi çok önemli. Dosya olmayabilir (ENOENT), izin sorunu olabilir (EACCES), dosya başka bir process tarafından kilitlenmiş olabilir. Her durumu ele almanız gerekir. Ben her dosya okuma işlemini try-catch veya hata callback'i ile sarıyorum.

Benden söylemesi, büyük dosyaları readFile ile okumayın. readFile tüm dosyayı belleğe yükler, gigabyte'lık bir log dosyası okumaya çalışırsanız bellek taşması yaşarsınız. Büyük dosyalar için createReadStream kullanın. Ben bir keresinde 2GB'lık bir CSV dosyasını readFile ile okumaya çalıştım ve uygulama çöktü, stream'e geçince sorun çözüldü.

Kolay gelsin, dosya yazma konusunda bir sonraki yazıda görüşmek üzere.
 

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

Geri
Üst