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.stat ile Dosya Bilgisi Alma
Selam arkadaşlar. Dosya işlemlerinde sadece okuma ve yazma yetmez, bazen dosya hakkında bilgi almamız gerekir: boyutu ne, ne zaman oluşturulmuş, dosya mı klasör mü, izinleri neler. fs.stat tam olarak bu bilgileri sağlar. Ben özellikle dosya upload boyut kontrolü, cache mekanizmaları ve log rotasyonu için stat'ı çok kullanıyorum.
stat ile Dosya Bilgileri
fs.stat bir dosya veya klasör hakkında detaylı bilgi döndürür. Stats nesnesi boyut, oluşturulma tarihi, değiştirilme tarihi, erişim izinleri ve dosya tipi gibi bilgileri içerir. Bu bilgiler dosya yönetimi, cache invalidation ve güvenlik kontrolleri için çok değerli.
Tecrübeme göre stat'ın en yararlı kullanımlarından biri dosya boyutu kontrolü. Upload edilen dosyaların boyutunu kontrol etmek, disk kullanımını izlemek ve büyük dosyaları tespit etmek için stat.size kullanıyorum. Ayrıca mtime (modification time) ile dosyanın ne zaman değiştirildiğini görebilir, bunu cache mekanizmalarında kullanabilirsiniz.
JavaScript:
// === fs.stat ile DOSYA BİLGİSİ ===
const fs = require('fs');
const path = require('path');
// Test dosyası oluştur
const testDosya = path.join(__dirname, 'stat-test.txt');
fs.writeFileSync(testDosya, 'Bu bir test dosyasıdır. '.repeat(100), 'utf-8');
// 1. Senkron stat
console.log('=== Dosya Bilgileri ===');
try {
const stat = fs.statSync(testDosya);
console.log('Dosya mı:', stat.isFile());
console.log('Klasör mü:', stat.isDirectory());
console.log('Sembolik link mi:', stat.isSymbolicLink());
console.log('Boyut:', stat.size, 'byte');
console.log('Boyut (KB):', (stat.size / 1024).toFixed(2), 'KB');
console.log('Oluşturulma:', stat.birthtime.toLocaleString('tr-TR'));
console.log('Son değişiklik:', stat.mtime.toLocaleString('tr-TR'));
console.log('Son erişim:', stat.atime.toLocaleString('tr-TR'));
console.log('İzinler (mode):', '0' + (stat.mode & 0o777).toString(8));
console.log('inode:', stat.ino);
console.log('Hard link sayısı:', stat.nlink);
} catch (hata) {
console.error('Stat hatası:', hata.message);
}
// 2. Asenkron stat - Promise
async function dosyaBilgisi(yol) {
try {
const stat = await fs.promises.stat(yol);
return {
isim: path.basename(yol),
tip: stat.isDirectory() ? 'Klasör' : 'Dosya',
boyut: formatBoyut(stat.size),
olusturulma: stat.birthtime.toLocaleString('tr-TR'),
duzenleme: stat.mtime.toLocaleString('tr-TR'),
uzanti: path.extname(yol) || '-'
};
} catch (hata) {
if (hata.code === 'ENOENT') return null;
throw hata;
}
}
function formatBoyut(byte) {
const birimler = ['B', 'KB', 'MB', 'GB', 'TB'];
let index = 0;
let boyut = byte;
while (boyut >= 1024 && index < birimler.length - 1) {
boyut /= 1024;
index++;
}
return `${boyut.toFixed(2)} ${birimler[index]}`;
}
dosyaBilgisi(testDosya).then(bilgi => {
console.log('\nDosya bilgisi:', bilgi);
});
// 3. Upload boyut kontrolü
function uploadBoyutKontrol(dosyaYolu, maxBoyutMB = 5) {
const stat = fs.statSync(dosyaYolu);
const boyutMB = stat.size / (1024 * 1024);
if (boyutMB > maxBoyutMB) {
return {
gecerli: false,
mesaj: `Dosya çok büyük: ${boyutMB.toFixed(2)} MB (max: ${maxBoyutMB} MB)`
};
}
return {
gecerli: true,
boyut: formatBoyut(stat.size)
};
}
console.log('\nBoyut kontrolü:', uploadBoyutKontrol(testDosya, 1));
// 4. Klasör boyutu hesaplama
function klasorBoyutu(dizinYolu) {
let toplamBoyut = 0;
let dosyaSayisi = 0;
let klasorSayisi = 0;
function hesapla(dir) {
const girisler = fs.readdirSync(dir, { withFileTypes: true });
for (const giris of girisler) {
const tam = path.join(dir, giris.name);
if (giris.isDirectory()) {
klasorSayisi++;
hesapla(tam);
} else {
dosyaSayisi++;
toplamBoyut += fs.statSync(tam).size;
}
}
}
hesapla(dizinYolu);
return {
toplamBoyut: formatBoyut(toplamBoyut),
dosyaSayisi,
klasorSayisi
};
}
console.log('\nMevcut dizin bilgisi:', klasorBoyutu(__dirname));
// 5. Dosya değişiklik izleme (basit cache)
class DosyaCache {
constructor() {
this.cache = new Map();
}
async oku(dosyaYolu) {
const stat = fs.statSync(dosyaYolu);
const mtime = stat.mtimeMs;
if (this.cache.has(dosyaYolu)) {
const cached = this.cache.get(dosyaYolu);
if (cached.mtime === mtime) {
console.log(' Cache hit:', path.basename(dosyaYolu));
return cached.icerik;
}
}
console.log(' Cache miss:', path.basename(dosyaYolu));
const icerik = fs.readFileSync(dosyaYolu, 'utf-8');
this.cache.set(dosyaYolu, { icerik, mtime });
return icerik;
}
}
const cache = new DosyaCache();
console.log('\n=== Cache Test ===');
cache.oku(testDosya);
cache.oku(testDosya); // Cache hit
// Temizlik
fs.unlinkSync(testDosya);
fs.stat dosya sistemiyle çalışırken çok değerli bilgiler sağlar. Boyut kontrolü, cache mekanizması, dosya tipi belirleme ve tarih bazlı işlemler için vazgeçilmez. lstat ve fstat alternatiflerini de bilin. 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
- 0
- Görüntüleme
- 52
- Cevaplar
- 9
- Görüntüleme
- 473
- Cevaplar
- 1
- Görüntüleme
- 586
- Cevaplar
- 1
- Görüntüleme
- 522
