R 1
Roksam
[DEV]AB 1
[DEV]AB
Sevdamsın 1
Sevdamsın
farkmt2official 1
farkmt2official
emirhanHCL 1
emirhanHCL
Scarlet 1
Scarlet
Best Studio 1
Best Studio
mannaxxx 1
mannaxxx
Agora Metin2 1
Agora Metin2
Hikaye Ekle

[NODE JS] fs.existsSync ile Dosya Varlığı Kontrolü

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.existsSync ile Dosya Varlığı Kontrolü​


Selam arkadaşlar. Dosya veya klasörün var olup olmadığını kontrol etmek çok temel bir ihtiyaç. Config dosyası var mı, upload klasörü oluşturulmuş mu, geçici dosya hala duruyor mu gibi sorulara cevap almak için fs.existsSync kullanıyoruz. Basit bir fonksiyon ama doğru kullanmayı bilmek gerekiyor.

existsSync ve Alternatifler​


fs.existsSync senkron olarak bir dosya veya klasörün var olup olmadığını kontrol eder ve boolean döndürür. Asenkron versiyonu olan fs.exists deprecated (kullanımdan kaldırılmış) çünkü callback paternine uymuyordu. Asenkron kontrol için fs.access veya try-catch ile fs.stat kullanmanız önerilir.

Şimdi önemli bir nokta var: existsSync ile kontrol edip sonra işlem yapmak arasında dosya silinebilir veya oluşturulabilir. Buna race condition denir. Ben genellikle dosyanın varlığını kontrol etmek yerine doğrudan işlemi yapıp hata yakalamayı tercih ediyorum. Ama basit senaryolarda existsSync gayet yeterli.

JavaScript:
// === fs.existsSync ile VARLIK KONTROLÜ ===

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

// Test dosyaları oluştur
const testDosya = path.join(__dirname, 'varlik-test.txt');
const testKlasor = path.join(__dirname, 'varlik-klasor');
fs.writeFileSync(testDosya, 'test', 'utf-8');
fs.mkdirSync(testKlasor, { recursive: true });

// 1. Temel varlık kontrolü
console.log('=== existsSync ===');
console.log('Dosya var mı:', fs.existsSync(testDosya));         // true
console.log('Klasör var mı:', fs.existsSync(testKlasor));        // true
console.log('Olmayan var mı:', fs.existsSync('/olmayan/yol'));    // false

// 2. Koşullu dosya oluşturma
function dosyaYoksaOlustur(yol, varsayilanIcerik = '') {
    if (!fs.existsSync(yol)) {
        fs.writeFileSync(yol, varsayilanIcerik, 'utf-8');
        console.log(`Oluşturuldu: ${path.basename(yol)}`);
        return true;
    }
    console.log(`Zaten var: ${path.basename(yol)}`);
    return false;
}

dosyaYoksaOlustur(testDosya, 'varsayılan içerik');
const yeniDosya = path.join(__dirname, 'yeni-dosya.txt');
dosyaYoksaOlustur(yeniDosya, 'yeni dosya içeriği');
fs.unlinkSync(yeniDosya);

// 3. Config dosyası yükleme paterni
function configYukle(configYolu) {
    const varsayilanConfig = {
        port: 3000,
        host: 'localhost',
        debug: false,
        logSeviyesi: 'info'
    };

    if (fs.existsSync(configYolu)) {
        try {
            const icerik = fs.readFileSync(configYolu, 'utf-8');
            const yuklenen = JSON.parse(icerik);
            console.log('Config dosyadan yüklendi');
            return { ...varsayilanConfig, ...yuklenen };
        } catch (hata) {
            console.error('Config okunamadı, varsayılan kullanılıyor');
            return varsayilanConfig;
        }
    }

    console.log('Config dosyası yok, varsayılan kullanılıyor');
    // Varsayılan config'i dosyaya kaydet
    fs.writeFileSync(configYolu, JSON.stringify(varsayilanConfig, null, 2));
    console.log('Varsayılan config kaydedildi');
    return varsayilanConfig;
}

const configDosya = path.join(__dirname, 'test-config.json');
const config = configYukle(configDosya);
console.log('Config:', config);
fs.unlinkSync(configDosya);

// 4. fs.access ile asenkron kontrol (modern yaklaşım)
async function erisimKontrol(yol) {
    try {
        await fs.promises.access(yol, fs.constants.F_OK);
        return true; // Dosya var
    } catch {
        return false; // Dosya yok
    }
}

async function detayliKontrol(yol) {
    const kontroller = {
        var: fs.constants.F_OK,
        okunabilir: fs.constants.R_OK,
        yazilabilir: fs.constants.W_OK,
        calistirilabilir: fs.constants.X_OK
    };

    const sonuclar = {};

    for (const [isim, bayrak] of Object.entries(kontroller)) {
        try {
            await fs.promises.access(yol, bayrak);
            sonuclar[isim] = true;
        } catch {
            sonuclar[isim] = false;
        }
    }

    return sonuclar;
}

detayliKontrol(testDosya).then(sonuc => {
    console.log('\nDetaylı kontrol:', sonuc);
});

// 5. Uygulama başlangıç kontrolleri
function baslangicKontrolleri() {
    const gerekliDizinler = [
        path.join(__dirname, 'logs'),
        path.join(__dirname, 'uploads'),
        path.join(__dirname, 'uploads', 'temp'),
        path.join(__dirname, 'cache')
    ];

    const gerekliDosyalar = [
        { yol: '.env', aciklama: 'Ortam değişkenleri' },
        { yol: 'package.json', aciklama: 'Proje konfigürasyonu' }
    ];

    console.log('\n=== Başlangıç Kontrolleri ===');

    // Dizin kontrolleri
    gerekliDizinler.forEach(dizin => {
        if (!fs.existsSync(dizin)) {
            fs.mkdirSync(dizin, { recursive: true });
            console.log(`  [OLUŞTURULDU] ${path.relative(__dirname, dizin)}/`);
        } else {
            console.log(`  [MEVCUT] ${path.relative(__dirname, dizin)}/`);
        }
    });

    // Dosya kontrolleri
    gerekliDosyalar.forEach(({ yol, aciklama }) => {
        const tamYol = path.join(__dirname, yol);
        const var_mi = fs.existsSync(tamYol);
        console.log(`  [${var_mi ? 'OK' : 'EKSIK'}] ${yol} (${aciklama})`);
    });

    // Temizlik
    gerekliDizinler.forEach(d => {
        try { fs.rmSync(d, { recursive: true }); } catch {}
    });
}

baslangicKontrolleri();

// Temizlik
fs.unlinkSync(testDosya);
fs.rmdirSync(testKlasor);

Dosya varlığı kontrolü basit ama her projede gerekli. existsSync hızlı kontroller için ideal, asenkron senaryolarda fs.access tercih edin, ve race condition riskini aklınızda tutun. Kolay gelsin.
 

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

Geri
Üst