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] __dirname ve __filename Nedir?
Selam arkadaşlar. Node.js'te dosya ve klasör yollarıyla çalışmak çok yaygın bir ihtiyaç. __dirname ve __filename bu konuda en çok kullanılan iki global değişkendir. Dosya okuma, şablon yükleme, statik dosya sunma gibi birçok senaryoda bu değişkenlere ihtiyaç duyarsınız. Ben her projemde mutlaka kullanıyorum ve doğru kullanmayı bilmek birçok hatadan kurtarır.
__dirname ve __filename Ne Döndürür?
__filename çalışan JavaScript dosyasının tam yolunu verir, __dirname ise o dosyanın bulunduğu klasörün tam yolunu verir. İkisi de mutlak yol döndürür. Bu değerler her modül için farklıdır, yani require ile yüklediğiniz farklı dosyalarda farklı __dirname değerleri alırsınız. Bu mantıklı çünkü her dosya farklı bir klasörde olabilir.
Dikkat etmeniz gereken bir nokta var: ES Modules kullanıyorsanız __dirname ve __filename doğrudan mevcut değildir. Bunun yerine import.meta.url kullanmanız ve ondan yol türetmeniz gerekir. Bu geçiş sancısı yaşayan çok kişi gördüm.
JavaScript:
// === __dirname ve __filename ===
// CommonJS'te (varsayılan Node.js modül sistemi)
console.log('=== Dosya Yolu Bilgileri ===');
console.log('__filename:', __filename); // Tam dosya yolu
console.log('__dirname:', __dirname); // Dosyanın bulunduğu klasör
// path modülü ile birlikte kullanım
const path = require('path');
// Dosya yolu oluşturma (platformdan bağımsız!)
const configYolu = path.join(__dirname, 'config', 'database.json');
const publicYolu = path.join(__dirname, '..', 'public');
const uploadsYolu = path.join(__dirname, 'uploads', 'images');
console.log('\nOluşturulan yollar:');
console.log('Config:', configYolu);
console.log('Public:', publicYolu);
console.log('Uploads:', uploadsYolu);
// path.resolve vs path.join farkı
const joinYol = path.join('a', 'b', 'c'); // a/b/c (göreceli)
const resolveYol = path.resolve('a', 'b', 'c'); // /tam/yol/a/b/c (mutlak)
console.log('\njoin:', joinYol);
console.log('resolve:', resolveYol);
// __dirname ile yaygın kullanımlar
// 1. Dosya okuma
const fs = require('fs');
function ayarOku() {
const ayarDosyasi = path.join(__dirname, 'ayarlar.json');
try {
// Gerçek dosya olmadığı için hata verecek, sadece gösterim
// const icerik = fs.readFileSync(ayarDosyasi, 'utf-8');
// return JSON.parse(icerik);
console.log('Ayar dosyası yolu:', ayarDosyasi);
} catch (hata) {
console.log('Ayar dosyası okunamadı (normal, demo için)');
return {};
}
}
ayarOku();
// 2. Şablon dosyaları yükleme
function sablonYukle(sablonAdi) {
const sablonYolu = path.join(__dirname, 'templates', `${sablonAdi}.html`);
console.log(`Şablon yolu: ${sablonYolu}`);
// return fs.readFileSync(sablonYolu, 'utf-8');
}
sablonYukle('email-bildirim');
sablonYukle('sifre-sifirlama');
// 3. Log dosyası oluşturma
function logDosyasiYolu() {
const logKlasoru = path.join(__dirname, '..', 'logs');
const tarih = new Date().toISOString().split('T')[0];
return path.join(logKlasoru, `app-${tarih}.log`);
}
console.log('\nLog dosyası:', logDosyasiYolu());
// 4. Statik dosya sunma (Express ile)
// app.use(express.static(path.join(__dirname, 'public')));
// app.use('/uploads', express.static(path.join(__dirname, 'uploads')));
console.log('Static dizin:', path.join(__dirname, 'public'));
ES Modules'da Eşdeğerleri
ES Modules kullanırken __dirname ve __filename mevcut değildir. Bunların yerine import.meta.url kullanılır ve url modülü ile dönüştürme yapılır. Bu biraz daha uzun bir yazım gerektiriyor ama modern Node.js'te standart yol bu.
Geçen bir projeyi CommonJS'ten ES Modules'a taşırken en çok sorun yaşadığım konu bu oldu. Tüm __dirname kullanımlarını bulup değiştirmem gerekti. O yüzden projenin başında hangi modül sistemini kullanacağınızı iyi kararlaştırın.
JavaScript:
// === ES MODULES'DA __dirname EŞDEĞERİ ===
// ES Modules kullanıyorsanız (.mjs veya "type": "module"):
// import { fileURLToPath } from 'url';
// import { dirname } from 'path';
// import path from 'path';
// const __filename = fileURLToPath(import.meta.url);
// const __dirname = dirname(__filename);
// Veya tek satırda:
// const __dirname = dirname(fileURLToPath(import.meta.url));
// Yardımcı fonksiyon oluşturabilirsiniz
// function getDirname(importMetaUrl) {
// return dirname(fileURLToPath(importMetaUrl));
// }
// const dir = getDirname(import.meta.url);
// CommonJS simülasyonu ile path işlemlerini gösterelim
const pathOrnekleri = {
// path.join - parçaları birleştirir (platformun ayırıcısı ile)
join: path.join('kullanicilar', 'ahmet', 'belgeler', 'rapor.txt'),
// path.resolve - mutlak yol oluşturur
resolve: path.resolve('src', 'controllers', 'userController.js'),
// path.basename - dosya adını verir
basename: path.basename('/home/user/app/server.js'),
// path.dirname - klasör yolunu verir
dirname: path.dirname('/home/user/app/server.js'),
// path.extname - uzantıyı verir
extname: path.extname('rapor.pdf'),
// path.parse - yolu parçalarına ayırır
parse: path.parse('/home/user/projeler/app/src/index.js'),
// path.format - parçalardan yol oluşturur
format: path.format({
dir: '/home/user/projeler',
name: 'config',
ext: '.json'
}),
// path.normalize - yolu temizler
normalize: path.normalize('/home/user/../user/./projeler//app'),
// path.isAbsolute - mutlak yol mu kontrol eder
isAbsoluteUnix: path.isAbsolute('/home/user'), // true
isAbsoluteRel: path.isAbsolute('src/index.js'), // false
// path.relative - iki yol arası göreceli yol
relative: path.relative('/home/user/app', '/home/user/lib'),
// path.sep - platform ayırıcısı
sep: path.sep // Windows: '\', Unix: '/'
};
console.log('\n=== Path Modülü Örnekleri ===');
Object.entries(pathOrnekleri).forEach(([isim, deger]) => {
console.log(`${isim}:`, deger);
});
// Platformdan bağımsız yol oluşturma
const platformBagimsiz = path.join('src', 'controllers', 'user.js');
console.log('\nPlatform bağımsız yol:', platformBagimsiz);
// Windows: src\controllers\user.js
// Linux/Mac: src/controllers/user.js
__dirname ve __filename ile path modülünü birlikte kullanmak dosya işlemlerinin temelidir. Her zaman path.join veya path.resolve kullanın, string birleştirme ile yol oluşturmayın. Çünkü Windows'ta \ Linux'ta / kullanılır, path modülü bu farkı sizin yerinize halleder. Kolay gelsin.
Şu an konuyu görüntüleyenler (Toplam : 0, Üye: 0, Misafir: 0)
Benzer konular
- Cevaplar
- 3
- Görüntüleme
- 480
- Cevaplar
- 9
- Görüntüleme
- 237
- Cevaplar
- 2
- Görüntüleme
- 82
- Cevaplar
- 2
- Görüntüleme
- 51
