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.unlink ile Dosya Silme

nodejs.png


[NODE JS] fs.unlink ile Dosya Silme​


Selam arkadaşlar. Dosya oluşturmayı ve yazmayı öğrendik, şimdi dosya silme zamanı. fs.unlink dosya silmek için kullanılan temel fonksiyon. Geçici dosyaları temizlemek, upload edilen dosyaları kaldırmak, eski log dosyalarını silmek gibi birçok senaryoda kullanılır. Ben özellikle dosya upload sistemlerinde ve cache temizleme işlerinde sık kullanıyorum.

unlink Kullanımı ve Dikkat Edilecekler​


unlink fonksiyonu bir dosyayı dosya sisteminden kalıcı olarak siler. Geri dönüşüm kutusuna taşımaz, silinen dosya geri gelmez. Bu yüzden dikkatli kullanmak gerekir. Dosya yoksa hata fırlatır (ENOENT), bu yüzden silmeden önce varlık kontrolü yapmak veya hatayı yakalamak iyi bir pratik.

Tecrübeme göre en sık karşılaşılan sorun, dosyanın başka bir process tarafından kullanılıyor olması. Windows'ta özellikle bu sorun çok yaşanır, dosya açıkken silemezsiniz. Linux'ta ise dosya silinir ama açık olan process dosyayı kullanmaya devam edebilir.

JavaScript:
// === fs.unlink ile DOSYA SİLME ===

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

// Test dosyaları oluşturalım
const testDir = __dirname;
const testDosyalar = [
    path.join(testDir, 'sil-test-1.txt'),
    path.join(testDir, 'sil-test-2.txt'),
    path.join(testDir, 'sil-test-3.txt'),
    path.join(testDir, 'gecici-rapor.json'),
    path.join(testDir, 'eski-log.txt')
];

testDosyalar.forEach(dosya => {
    fs.writeFileSync(dosya, `Test dosyası: ${path.basename(dosya)}`, 'utf-8');
});
console.log('Test dosyaları oluşturuldu');

// 1. Senkron silme
console.log('\n=== Senkron Silme ===');
try {
    fs.unlinkSync(testDosyalar[0]);
    console.log('sil-test-1.txt silindi');
} catch (hata) {
    if (hata.code === 'ENOENT') {
        console.log('Dosya zaten mevcut değil');
    } else if (hata.code === 'EACCES') {
        console.error('İzin hatası: Dosya silinemedi');
    } else {
        console.error('Silme hatası:', hata.message);
    }
}

// 2. Asenkron silme - Callback
fs.unlink(testDosyalar[1], (hata) => {
    if (hata) {
        console.error('Callback silme hatası:', hata.message);
        return;
    }
    console.log('sil-test-2.txt silindi (callback)');
});

// 3. Asenkron silme - Promise
async function dosyaSil(dosyaYolu) {
    try {
        await fs.promises.unlink(dosyaYolu);
        console.log(`${path.basename(dosyaYolu)} silindi (promise)`);
        return true;
    } catch (hata) {
        if (hata.code === 'ENOENT') {
            console.log(`${path.basename(dosyaYolu)} zaten silinmiş`);
            return true;
        }
        console.error(`Silme hatası (${path.basename(dosyaYolu)}):`, hata.message);
        return false;
    }
}

async function testSilme() {
    await dosyaSil(testDosyalar[2]);
    await dosyaSil(testDosyalar[3]);
    await dosyaSil(testDosyalar[4]);

    // Olmayan dosyayı silmeye çalış
    await dosyaSil(path.join(testDir, 'olmayan-dosya.txt'));
}
testSilme();

// 4. Güvenli silme fonksiyonu (varlık kontrolü ile)
function guvenliSil(dosyaYolu) {
    if (fs.existsSync(dosyaYolu)) {
        fs.unlinkSync(dosyaYolu);
        return true;
    }
    return false;
}

// 5. Birden fazla dosya silme
async function cokluSil(dosyaListesi) {
    const sonuclar = await Promise.allSettled(
        dosyaListesi.map(dosya => fs.promises.unlink(dosya))
    );

    sonuclar.forEach((sonuc, i) => {
        const dosyaAdi = path.basename(dosyaListesi[i]);
        if (sonuc.status === 'fulfilled') {
            console.log(`  [OK] ${dosyaAdi}`);
        } else {
            console.log(`  [HATA] ${dosyaAdi}: ${sonuc.reason.code}`);
        }
    });
}

// 6. Belirli uzantıdaki dosyaları silme
async function uzantiyaGoreSil(dizin, uzanti) {
    try {
        const dosyalar = await fs.promises.readdir(dizin);
        const hedefler = dosyalar.filter(d => d.endsWith(uzanti));

        console.log(`\n${uzanti} uzantılı ${hedefler.length} dosya bulundu`);

        for (const dosya of hedefler) {
            const tamYol = path.join(dizin, dosya);
            await fs.promises.unlink(tamYol);
            console.log(`  Silindi: ${dosya}`);
        }
    } catch (hata) {
        console.error('Toplu silme hatası:', hata.message);
    }
}

// 7. Eski dosyaları temizleme (log rotasyonu)
async function eskiDosyalariTemizle(dizin, gunSayisi) {
    const sinir = Date.now() - (gunSayisi * 24 * 60 * 60 * 1000);

    try {
        const dosyalar = await fs.promises.readdir(dizin);

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

            if (stat.isFile() && stat.mtimeMs < sinir) {
                await fs.promises.unlink(tamYol);
                console.log(`  Eski dosya silindi: ${dosya}`);
            }
        }
    } catch (hata) {
        console.error('Temizleme hatası:', hata.message);
    }
}

console.log('\n=== Temizleme Fonksiyonları ===');
console.log('uzantiyaGoreSil ve eskiDosyalariTemizle hazır');

Dosya silme geri dönüşü olmayan bir işlem, dikkatli olun. Silmeden önce varlık kontrolü yapın, hataları yakalayın ve production'da silme işlemlerini loglayın. Özellikle kullanıcı dosyalarını silerken ekstra dikkatli olun. Kolay gelsin.
 

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

Geri
Üst