fs.writeFile(path, data, callback) bir dosyaya bir string ya da Buffer yazar. Dosya yoksa Node onu oluşturur; varsa eski içerik değiştirilir. fs.writeFileSync(path, data) aynısını yapar ve yazma bitene kadar bekler, fs.appendFile ise dosyayı değiştirmek yerine sonuna ekler.
Önce saved, sonra geri okuduğu metni yazdırır; callback yalnızca bir hata (ya da null) alır, asla veriyi almaz. String yerine 42 verirsen çağrı bir TypeError fırlatır: veri bir string ya da bir Buffer olmalı.
writeFile, writeFileSync ve fs/promises
Üç biçim de aynı argümanları alır ve sonucu nasıl beklediğin konusunda farklıdır.
const fs = require('fs');
const fsp = require('fs/promises');
fs.writeFileSync('a.txt', 'one'); // blocks, throws on error
fs.writeFile('b.txt', 'two', (err) => {}); // callback with err
await fsp.writeFile('c.txt', 'three'); // promise, use in async code
writeFileSync fonksiyonunu script'lerde ve açılış kodunda, promise sürümünü ise senkron yazmanın disk işini bitirene kadar diğer bütün istekleri blokladığı sunucularda kullan. Promise API'sinin geri kalanını fs/promises sayfası gösteriyor.
appendFile ile dosyaya ekleme
writeFile bütün dosyayı değiştirir. Bir log'a satır eklemek için, dosyayı ilk seferde de oluşturan appendFile kullan.
İlk okuma "second\n" yazdırır, çünkü ikinci writeFileSync first değerinin yerine geçti; ikincisi ise "second\nthird\nfourth\n" yazdırır (JSON.stringify yeni satırları görünür yapar). \n karakterini kendin ekle: iki fonksiyon da eklemez.
writeFile | appendFile | |
|---|---|---|
| Dosya yoksa | Oluşturur | Oluşturur |
| Dosya varsa | İçeriği değiştirir | Sona ekler |
| Varsayılan flag | 'w' | 'a' |
| Tipik kullanım | Bütün bir belgeyi ya da JSON'u kaydetmek | Log'lar, her seferinde bir satır |
Üzerine yazma: flag seçeneği
Üçüncü argüman bir seçenek nesnesi olabilir. Onun flag değeri, var olan bir dosyaya ne olacağına karar verir. 'wx', "yaz, ama dosya zaten varsa başarısız ol" demektir ve bir dosyayı yalnızca bir kez oluşturmanın güvenli yoludur.
İkinci çağrı EEXIST ile başarısız olur, bu yüzden dosya hâlâ abc123 tutar. İkinci çağrının dosya adını id2.txt yap, iki çağrı da created yazdırır.
En sık karşılaşacağın flag'ler: 'w' (varsayılan, değiştir), 'a' (ekle), 'wx' (yalnızca oluştur) ve 'ax' (ekle, ama yalnızca yeni bir dosyaya).
Önce fs.existsSync ile kontrol edip sonra yazmanın bir açığı var: başka bir süreç kontrol ile yazma arasında dosyayı oluşturabilir. 'wx' ikisini tek adımda yapar.
Dosyaya JSON yazma
writeFile nesne kabul etmez. Onları JSON.stringify ile metne çevir; üçüncü argüman olan 2, dosya okunabilir olsun diye çıktıyı girintiler.
Dosya, nesneyi girintili birkaç satıra yayılmış olarak tutar ve onu geri parse etmek eşit bir nesne verir, bu yüzden son satır 2 yazdırır. Nesneyi JSON.stringify olmadan verirsen çağrı bir TypeError fırlatır.
Önce mkdir ile klasörü oluştur
writeFile klasör değil, dosya oluşturur. reports yokken reports/2026/june.txt dosyasına yazmak ENOENT ile başarısız olur. Önce path'i mkdir ve { recursive: true } ile oluştur; bu, eksik her klasörü oluşturur ve klasörler zaten varsa hiçbir şey yapmaz.
İlk yazma ENOENT ile başarısız olur; mkdir sonrasında aynı yazma başarılı olur ve readdir, [ 'june.txt' ] listeler. Gerçek kodda bu path'leri Windows'ta da çalışsınlar diye path.join ile oluştur.
Sık yapılan hatalar
Dosyanın çağrıdan hemen sonra yazıldığını sanmak. fs.writeFile, veri diske yazılmadan döner. Dosyayı oku ya da sonraki adımı callback'in içinde başlat, veya promise sürümünü await et.
Bir döngüde yazarak veri kaybetmek. Her öğe için bir kez writeFile çağırmak dosyayı her seferinde değiştirir ve yalnızca son öğeyi bırakır. appendFile kullan ya da bütün string'i oluşturup bir kez yaz.
[object Object] yazmak. Bir nesneyi String() ya da bir template literal içinden geçirmek [object Object] yazar. JSON.stringify kullan.
Sıkça Sorulan Sorular
fs.writeFile dosyanın üzerine yazar mı?
Evet. Varsayılan 'w' flag'iyle dosyayı boşaltır ve yeni veriyi yazar, yani eski içerik gider. Bunun yerine sona eklemek için { flag: 'a' } ver ya da appendFile kullan.
fs.writeFile dosya yoksa oluşturur mu?
Evet, dosyayı oluşturur. Ama eksik klasörleri oluşturmaz: logs yokken logs/app.log dosyasına yazmak ENOENT ile başarısız olur.
Veri olarak ne verebilirim?
Bir string, bir Buffer ya da bir typed array. Nesne ya da sayı gibi başka her şey TypeError fırlatır, bu yüzden önce nesneleri JSON.stringify ile, sayıları String() ile dönüştür.
Aynı dosyada writeFile'ı aynı anda birçok kez çağırmak güvenli mi?
Hayır. Bir dosyada paralel iki writeFile çağrısı birbirine karışabilir ve karışık içerik bırakabilir. Bir sonrakini başlatmadan önce birinin bitmesini bekle ya da veriyi toplayıp bir kez yaz.