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!
[NODE JS] fs.writeFile ile Dosya Yazma
Merhaba arkadaşlar. Dosya okumayı öğrendik, şimdi dosya yazma zamanı. fs.writeFile Node.js'te dosya oluşturmanın ve içerik yazmanın en temel yolu. Log dosyaları, rapor oluşturma, veri dışa aktarma, konfigürasyon kaydetme gibi birçok senaryoda kullanılır. Ben özellikle otomatik rapor oluşturma ve veri export işlemlerinde çok kullanıyorum.
Dosya Yazma Yöntemleri
writeFile mevcut dosyanın tüm içeriğini siler ve yenisini yazar. Eğer dosya yoksa otomatik oluşturur. Bu davranışı bilmek çok önemli çünkü farkında olmadan veri kaybedebilirsiniz. Var olan dosyaya ekleme yapmak istiyorsanız appendFile kullanmalısınız, onu da bir sonraki konuda göreceğiz.
Tecrübeme göre en kritik nokta yazma işleminin atomik olmamasıdır. writeFile çağrıldığında dosya önce boşaltılır, sonra yeni içerik yazılır. Eğer bu süreçte uygulama çökerse dosya boş kalabilir. Production'da önemli dosyalar için geçici dosyaya yaz, sonra rename yap stratejisi kullanıyorum.
JavaScript:
// === fs.writeFile ile DOSYA YAZMA ===
const fs = require('fs');
const path = require('path');
const testDir = __dirname;
// 1. Senkron yazma
console.log('=== Senkron Yazma ===');
try {
const dosyaYolu = path.join(testDir, 'senkron-test.txt');
fs.writeFileSync(dosyaYolu, 'Bu senkron olarak yazıldı.\nİkinci satır.', 'utf-8');
console.log('Senkron yazma başarılı');
// Doğrulama
const icerik = fs.readFileSync(dosyaYolu, 'utf-8');
console.log('İçerik:', icerik);
fs.unlinkSync(dosyaYolu);
} catch (hata) {
console.error('Yazma hatası:', hata.message);
}
// 2. Asenkron yazma - Callback
console.log('\n=== Asenkron Yazma (Callback) ===');
const callbackDosya = path.join(testDir, 'callback-test.txt');
fs.writeFile(callbackDosya, 'Callback ile yazıldı!', 'utf-8', (hata) => {
if (hata) {
console.error('Hata:', hata.message);
return;
}
console.log('Callback yazma başarılı');
fs.unlinkSync(callbackDosya);
});
// 3. Asenkron yazma - Promise
console.log('\n=== Asenkron Yazma (Promise) ===');
async function promiseYazma() {
const dosya = path.join(testDir, 'promise-test.txt');
try {
await fs.promises.writeFile(dosya, 'Promise ile yazıldı!', 'utf-8');
console.log('Promise yazma başarılı');
const icerik = await fs.promises.readFile(dosya, 'utf-8');
console.log('Doğrulama:', icerik);
await fs.promises.unlink(dosya);
} catch (hata) {
console.error('Promise hatası:', hata.message);
}
}
promiseYazma();
// 4. JSON dosyası yazma
async function configKaydet(config) {
const dosya = path.join(testDir, 'app-config.json');
try {
const json = JSON.stringify(config, null, 2);
await fs.promises.writeFile(dosya, json, 'utf-8');
console.log('\nConfig kaydedildi');
// Temizlik
await fs.promises.unlink(dosya);
} catch (hata) {
console.error('Config kaydetme hatası:', hata.message);
}
}
configKaydet({
sunucu: { port: 3000, host: 'localhost' },
veritabani: { url: 'mongodb://localhost:27017/app' },
jwt: { secret: 'gizli-anahtar', expiry: '24h' }
});
// 5. Rapor oluşturma (pratik örnek)
function raporOlustur(veriler) {
const tarih = new Date().toLocaleDateString('tr-TR');
let rapor = `=== Günlük Satış Raporu (${tarih}) ===\n\n`;
let toplamGelir = 0;
veriler.forEach((v, i) => {
const satirToplam = v.fiyat * v.adet;
toplamGelir += satirToplam;
rapor += `${i + 1}. ${v.urun} - ${v.adet} adet x ${v.fiyat} TL = ${satirToplam} TL\n`;
});
rapor += `\n--- TOPLAM: ${toplamGelir.toLocaleString('tr-TR')} TL ---\n`;
rapor += `Oluşturulma: ${new Date().toISOString()}\n`;
return rapor;
}
const satisVerileri = [
{ urun: 'Laptop', fiyat: 25000, adet: 3 },
{ urun: 'Mouse', fiyat: 500, adet: 15 },
{ urun: 'Klavye', fiyat: 1200, adet: 8 },
{ urun: 'Monitör', fiyat: 8000, adet: 5 }
];
const rapor = raporOlustur(satisVerileri);
console.log('\n' + rapor);
// 6. Güvenli yazma (atomik)
async function guvenliYaz(dosyaYolu, icerik) {
const geciciDosya = dosyaYolu + '.tmp';
try {
// Önce geçici dosyaya yaz
await fs.promises.writeFile(geciciDosya, icerik, 'utf-8');
// Sonra rename ile atomik olarak taşı
await fs.promises.rename(geciciDosya, dosyaYolu);
console.log('Güvenli yazma başarılı');
} catch (hata) {
// Geçici dosya kaldıysa temizle
try { await fs.promises.unlink(geciciDosya); } catch {}
throw hata;
}
}
// 7. Yazma seçenekleri
const yazmaSec = {
encoding: 'utf-8', // Karakter kodlaması
mode: 0o666, // Dosya izinleri (Unix)
flag: 'w' // Yazma modu
};
// flag değerleri:
// 'w' - Yaz (var olanı siler, yoksa oluşturur) [VARSAYILAN]
// 'wx' - Özel yaz (dosya varsa HATA verir)
// 'a' - Ekle (dosya sonuna ekler)
// 'ax' - Özel ekle (dosya varsa HATA verir)
// 'r+' - Okuma-yazma (dosya yoksa HATA verir)
console.log('\nYazma bayrakları:', JSON.stringify(yazmaSec, null, 2));
Dosya yazma basit görünür ama production'da dikkatli olmak gerekiyor. Önemli veriler için atomik yazma kullanın, hata yönetimini ihmal etmeyin ve yazma izinlerini kontrol edin. Büyük veriler için stream kullanmayı düşünün. Kolay gelsin.
Emeğiniz ve katkınız için teşekkür ederiz!
Konunuz gerekli incelemelerden geçerek onaylandı. Topluluğumuza katkılarınızın devamını bekliyoruz.
İyi forumlar!
Konunuz gerekli incelemelerden geçerek onaylandı. Topluluğumuza katkılarınızın devamını bekliyoruz.
İyi forumlar!

Şu an konuyu görüntüleyenler (Toplam : 0, Üye: 0, Misafir: 0)
Benzer konular
- Cevaplar
- 2
- Görüntüleme
- 390
- Cevaplar
- 1
- Görüntüleme
- 36
- Cevaplar
- 9
- Görüntüleme
- 473
- Cevaplar
- 3
- Görüntüleme
- 3K
- Cevaplar
- 3
- Görüntüleme
- 789
