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.copyFile ile Dosya Kopyalama
Selam arkadaşlar. Node.js dosya işlemleri serimizin son konusuna geldik: dosya kopyalama. fs.copyFile dosyayı bir konumdan başka bir konuma kopyalar. Yedekleme, şablon dosya oluşturma, deployment ve veri çoğaltma gibi senaryolarda kullanılır. Ben özellikle deployment scriptlerinde ve yedekleme sistemlerinde çok kullanıyorum.
copyFile Kullanımı
fs.copyFile kaynak dosyayı hedef konuma kopyalar. Hedef dosya zaten varsa üzerine yazar. Bu davranışı değiştirmek istiyorsanız COPYFILE_EXCL bayrağı ile hedef dosya varsa hata verdirirsiniz. Bu bayrak yanlışlıkla dosya üzerine yazmayı engeller ve özellikle yedekleme senaryolarında çok kullanışlı.
Tecrübeme göre dosya kopyalama işlemi basit dosyalar için çok hızlıdır ama büyük dosyalar için stream kullanmak daha iyi olabilir. copyFile dahili olarak zaten stream kullanır ama kopyalama sırasında ilerleme takibi yapmak istiyorsanız kendi stream'inizi yazmanız gerekir. Ben gigabyte'lık dosyalar kopyalarken ilerleme çubuğu göstermek için stream kullanıyorum.
JavaScript:
// === fs.copyFile ile DOSYA KOPYALAMA ===
const fs = require('fs');
const path = require('path');
// Test dosyası oluştur
const kaynakDosya = path.join(__dirname, 'kaynak.txt');
fs.writeFileSync(kaynakDosya, 'Bu orijinal dosya içeriğidir.\nİkinci satır.\nÜçüncü satır.', 'utf-8');
// 1. Senkron kopyalama
console.log('=== Senkron Kopyalama ===');
const hedef1 = path.join(__dirname, 'kopya-1.txt');
try {
fs.copyFileSync(kaynakDosya, hedef1);
console.log(`${path.basename(kaynakDosya)} -> ${path.basename(hedef1)}`);
// İçerik doğrulama
const icerik = fs.readFileSync(hedef1, 'utf-8');
console.log('Kopyalanan içerik:', icerik.substring(0, 30) + '...');
} catch (hata) {
console.error('Kopyalama hatası:', hata.message);
}
// 2. COPYFILE_EXCL ile güvenli kopyalama
console.log('\n=== Güvenli Kopyalama (EXCL) ===');
const hedef2 = path.join(__dirname, 'kopya-2.txt');
try {
// İlk kopyalama başarılı olur
fs.copyFileSync(kaynakDosya, hedef2, fs.constants.COPYFILE_EXCL);
console.log('İlk kopyalama başarılı');
// İkinci kopyalama hata verir (dosya zaten var)
fs.copyFileSync(kaynakDosya, hedef2, fs.constants.COPYFILE_EXCL);
} catch (hata) {
if (hata.code === 'EEXIST') {
console.log('Hedef dosya zaten mevcut, üzerine yazılmadı (güvenli!)');
}
}
// 3. Asenkron kopyalama - Promise
async function dosyaKopyala(kaynak, hedef, ustYazma = true) {
try {
const bayrak = ustYazma ? 0 : fs.constants.COPYFILE_EXCL;
await fs.promises.copyFile(kaynak, hedef, bayrak);
console.log(`Kopyalandı: ${path.basename(kaynak)} -> ${path.basename(hedef)}`);
return true;
} catch (hata) {
if (hata.code === 'EEXIST') {
console.log('Hedef zaten var, atlanıyor');
} else if (hata.code === 'ENOENT') {
console.error('Kaynak dosya bulunamadı');
} else {
console.error('Kopyalama hatası:', hata.message);
}
return false;
}
}
// 4. Yedekleme fonksiyonu
function yedekOlustur(dosyaYolu) {
const dizin = path.dirname(dosyaYolu);
const ad = path.basename(dosyaYolu, path.extname(dosyaYolu));
const uzanti = path.extname(dosyaYolu);
const tarih = new Date().toISOString().replace(/[:.]/g, '-').substr(0, 19);
const yedekAd = `${ad}_yedek_${tarih}${uzanti}`;
const yedekYolu = path.join(dizin, yedekAd);
fs.copyFileSync(dosyaYolu, yedekYolu);
console.log(`Yedek oluşturuldu: ${yedekAd}`);
return yedekYolu;
}
const yedekYolu = yedekOlustur(kaynakDosya);
// 5. Klasörü kopyalama (recursive)
async function klasorKopyala(kaynakDizin, hedefDizin) {
// Hedef dizini oluştur
await fs.promises.mkdir(hedefDizin, { recursive: true });
let kopyalanan = 0;
const girisler = await fs.promises.readdir(kaynakDizin, { withFileTypes: true });
for (const giris of girisler) {
const kaynakYol = path.join(kaynakDizin, giris.name);
const hedefYol = path.join(hedefDizin, giris.name);
if (giris.isDirectory()) {
kopyalanan += await klasorKopyala(kaynakYol, hedefYol);
} else {
await fs.promises.copyFile(kaynakYol, hedefYol);
kopyalanan++;
}
}
return kopyalanan;
}
// 6. Stream ile kopyalama (büyük dosyalar + ilerleme takibi)
function streamIleKopyala(kaynak, hedef) {
return new Promise((resolve, reject) => {
const kaynakStat = fs.statSync(kaynak);
const toplamBoyut = kaynakStat.size;
let kopyalanan = 0;
const okumaStream = fs.createReadStream(kaynak);
const yazmaStream = fs.createWriteStream(hedef);
okumaStream.on('data', (chunk) => {
kopyalanan += chunk.length;
const yuzde = ((kopyalanan / toplamBoyut) * 100).toFixed(1);
process.stdout.write(`\rKopyalanıyor: ${yuzde}%`);
});
okumaStream.on('error', reject);
yazmaStream.on('error', reject);
yazmaStream.on('finish', () => {
console.log(' - Tamamlandı!');
resolve();
});
okumaStream.pipe(yazmaStream);
});
}
// 7. Deployment dosya kopyalama
async function deployDosyalariKopyala(kaynakDizin, hedefDizin, dosyaDeseni) {
const dosyalar = await fs.promises.readdir(kaynakDizin);
const eslesen = dosyalar.filter(d => {
if (dosyaDeseni instanceof RegExp) return dosyaDeseni.test(d);
return d.endsWith(dosyaDeseni);
});
await fs.promises.mkdir(hedefDizin, { recursive: true });
console.log(`\n${eslesen.length} dosya kopyalanıyor...`);
for (const dosya of eslesen) {
const kaynak = path.join(kaynakDizin, dosya);
const hedef = path.join(hedefDizin, dosya);
const stat = await fs.promises.stat(kaynak);
if (stat.isFile()) {
await fs.promises.copyFile(kaynak, hedef);
console.log(` ${dosya} -> ${hedefDizin}`);
}
}
}
// Test ve temizlik
async function main() {
await streamIleKopyala(kaynakDosya, path.join(__dirname, 'stream-kopya.txt'));
// Temizlik
const temizlenecek = [
kaynakDosya, hedef1, hedef2, yedekYolu,
path.join(__dirname, 'stream-kopya.txt')
];
temizlenecek.forEach(d => {
try { fs.unlinkSync(d); } catch {}
});
console.log('\nTemizlik tamamlandı');
}
main();
Ve böylece Node.js dosya işlemleri serimizin sonuna geldik. fs modülü Node.js'in en temel modüllerinden biri ve bu konuları iyi bilmek backend geliştirme için şart. Dosya okuma, yazma, silme, taşıma, kopyalama ve bilgi alma konularını artık biliyorsunuz. Bu bilgileri gerçek projelerde uyguladıkça pekiştireceksiniz. Herkese kolay gelsin, sorularınız varsa yazın.
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
