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 Promises API ile Modern Dosya Islemleri
Selam arkadaslar, bugun Node.js dunyasinda dosya islemlerini nasil daha modern ve temiz bir sekilde yapabilecegimizi konusacagiz. Eger hala callback tabanli fs fonksiyonlarini kullaniyorsaniz, bu yaziyi okuduktan sonra hayatiniz degisecek demek isterdim ama en azindan kodunuz cok daha okunakli olacak. fs Promises API, Node.js 10 ile birlikte gelen ve dosya islemlerinde Promise tabanli calismamizi saglayan harika bir ozellik.
Neden Promises API?
Eskiden Node.js'te dosya islemleri yapmak icin callback kullanmak zorundaydik. Bir dosya okumak icin callback, sonra baska bir dosyaya yazmak icin ic ice bir callback daha, derken kodumuz callback hell'e donuyordu. Ben ilk Node.js projemde bu tuzaga dustum ve kodu baska birine devrettigimde adam "bu ne kardesim" demisti. Hakliymis da.
Promises API ile artik async/await kullanarak dosya islemlerini sanki senkronmus gibi yazabiliyoruz. Kod okunakli, hata yonetimi kolay ve zincirleme islemler cok daha anlasilir oluyor. Benim tavsiyem, yeni projelerinizde kesinlikle Promises API kullanmaniz yonunde.
Temel Kullanim
fs Promises API'yi kullanmanin iki yolu var. Birincisi require('fs').promises seklinde, ikincisi ve daha modern olani require('fs/promises') seklinde. Ben ikincisini tercih ediyorum cunku daha temiz gorunuyor ve Node.js 14+ ile sorunsuz calisiyor.
JavaScript:
const fs = require('fs/promises');
const path = require('path');
// Dosya okuma - async/await ile
async function dosyaOku(dosyaYolu) {
try {
const icerik = await fs.readFile(dosyaYolu, 'utf8');
console.log('Dosya icerigi:');
console.log(icerik);
return icerik;
} catch (error) {
if (error.code === 'ENOENT') {
console.error('Dosya bulunamadi:', dosyaYolu);
} else if (error.code === 'EACCES') {
console.error('Dosyaya erisim izni yok:', dosyaYolu);
} else {
console.error('Beklenmeyen hata:', error.message);
}
throw error;
}
}
// Dosya yazma
async function dosyaYaz(dosyaYolu, icerik) {
try {
await fs.writeFile(dosyaYolu, icerik, 'utf8');
console.log('Dosya basariyla yazildi:', dosyaYolu);
} catch (error) {
console.error('Yazma hatasi:', error.message);
throw error;
}
}
// Dosya ekleme (append)
async function dosyayaEkle(dosyaYolu, eklenecek) {
try {
await fs.appendFile(dosyaYolu, eklenecek + '\n', 'utf8');
console.log('Veri basariyla eklendi');
} catch (error) {
console.error('Ekleme hatasi:', error.message);
throw error;
}
}
// Kullanim
async function main() {
const hedef = path.join(__dirname, 'ornek.txt');
await dosyaYaz(hedef, 'Merhaba Dunya!\n');
await dosyayaEkle(hedef, 'Bu satirda eklendi.');
const sonuc = await dosyaOku(hedef);
console.log('Okunan:', sonuc);
}
main().catch(console.error);
Klasor Islemleri
Dosya islemlerinin yani sira klasor islemleri de Promises API ile cok daha kolay. mkdir, readdir, rmdir gibi fonksiyonlarin hepsi Promise donduruyor. Ozellikle readdir'in withFileTypes secenegi cok ise yariyor, dosya mi klasor mu oldugunu anlamak icin ayrica stat cagirmak zorunda kalmiyorsunuz.
JavaScript:
const fs = require('fs/promises');
const path = require('path');
// Klasor olusturma (recursive)
async function klasorOlustur(klasorYolu) {
try {
await fs.mkdir(klasorYolu, { recursive: true });
console.log('Klasor olusturuldu:', klasorYolu);
} catch (error) {
console.error('Klasor olusturma hatasi:', error.message);
}
}
// Klasor icerigini listeleme
async function klasorListele(klasorYolu) {
try {
const elemanlar = await fs.readdir(klasorYolu, { withFileTypes: true });
console.log(`\n"${klasorYolu}" icerigi:`);
console.log('-'.repeat(50));
for (const eleman of elemanlar) {
const tur = eleman.isDirectory() ? '[KLASOR]' : '[DOSYA]';
const tamYol = path.join(klasorYolu, eleman.name);
if (eleman.isFile()) {
const stat = await fs.stat(tamYol);
const boyut = (stat.size / 1024).toFixed(2);
console.log(` ${tur} ${eleman.name} (${boyut} KB)`);
} else {
console.log(` ${tur} ${eleman.name}/`);
}
}
} catch (error) {
console.error('Listeleme hatasi:', error.message);
}
}
// Dosya kopyalama
async function dosyaKopyala(kaynak, hedef) {
try {
await fs.copyFile(kaynak, hedef);
console.log(`Kopyalandi: ${kaynak} -> ${hedef}`);
} catch (error) {
console.error('Kopyalama hatasi:', error.message);
}
}
// Dosya tasima / yeniden adlandirma
async function dosyaTasi(eskiYol, yeniYol) {
try {
await fs.rename(eskiYol, yeniYol);
console.log(`Tasindi: ${eskiYol} -> ${yeniYol}`);
} catch (error) {
console.error('Tasima hatasi:', error.message);
}
}
// Dosya silme
async function dosyaSil(dosyaYolu) {
try {
await fs.unlink(dosyaYolu);
console.log('Dosya silindi:', dosyaYolu);
} catch (error) {
if (error.code === 'ENOENT') {
console.log('Dosya zaten mevcut degil:', dosyaYolu);
} else {
console.error('Silme hatasi:', error.message);
}
}
}
// Ana akis
async function main() {
const testKlasor = path.join(__dirname, 'test-promises');
await klasorOlustur(path.join(testKlasor, 'alt-klasor', 'derin'));
const testDosya = path.join(testKlasor, 'deneme.txt');
await fs.writeFile(testDosya, 'Promises API harika!');
await klasorListele(testKlasor);
const kopyaDosya = path.join(testKlasor, 'deneme-kopya.txt');
await dosyaKopyala(testDosya, kopyaDosya);
await klasorListele(testKlasor);
}
main().catch(console.error);
Dosya Bilgisi Alma (stat)
Dosya bilgisi almak icin stat fonksiyonunu kullanabilirsiniz. Bu fonksiyon size dosyanin boyutu, olusturulma tarihi, degistirilme tarihi, izinleri gibi bilgileri verir. Ben genelde log rotation yaparken dosya boyutunu kontrol etmek icin kullaniyorum. Bir dosyanin belirli bir boyutu asip asmadigini kontrol edip ona gore islem yapabilirsiniz.
Tecrubeme gore stat fonksiyonunu gereksiz yere surekli cagirmak performansi olumsuz etkileyebilir. Eger sadece dosyanin var olup olmadigini kontrol etmek istiyorsaniz, access fonksiyonunu kullanmak daha dogru bir yaklasim olur.
JavaScript:
const fs = require('fs/promises');
const path = require('path');
async function dosyaBilgisi(dosyaYolu) {
try {
const stat = await fs.stat(dosyaYolu);
console.log('Dosya Bilgileri:');
console.log('================');
console.log('Boyut:', stat.size, 'byte');
console.log('Boyut (KB):', (stat.size / 1024).toFixed(2), 'KB');
console.log('Olusturulma:', stat.birthtime.toLocaleString('tr-TR'));
console.log('Son Degisiklik:', stat.mtime.toLocaleString('tr-TR'));
console.log('Son Erisim:', stat.atime.toLocaleString('tr-TR'));
console.log('Dosya mi?', stat.isFile());
console.log('Klasor mu?', stat.isDirectory());
console.log('Sembolik link mi?', stat.isSymbolicLink());
return stat;
} catch (error) {
if (error.code === 'ENOENT') {
console.log('Dosya bulunamadi');
}
throw error;
}
}
// Dosya var mi kontrol
async function dosyaVarMi(dosyaYolu) {
try {
await fs.access(dosyaYolu, fs.constants.F_OK);
return true;
} catch {
return false;
}
}
async function main() {
const dosya = path.join(__dirname, 'package.json');
if (await dosyaVarMi(dosya)) {
await dosyaBilgisi(dosya);
} else {
console.log('Dosya mevcut degil');
}
}
main().catch(console.error);
Promises API gercekten hayat kurtarici. Callback cehenneminden kurtulmak ve daha temiz, okunakli kod yazmak istiyorsaniz hemen gecis yapin. Eski projelerinizde bile yavastan bu API'ye gecmeye baslayabilirsiniz, geriye donuk uyumlu cunku iki API ayni anda kullanilabiliyor. Hadi bakalim, bir sonraki konuda gorusuruz!
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
- 1
- Görüntüleme
- 36
- Cevaplar
- 3
- Görüntüleme
- 439
- Cevaplar
- 1
- Görüntüleme
- 522
- Cevaplar
- 4
- Görüntüleme
- 2K
