Node.js'te Dosya Yönetimi (File Management)

Node.js'te Dosya Yönetimi (File Management)

JavaScript, yıllar boyunca dosya sistemine erişim bakımından çok sınırlı olanaklar sağlıyordu. JavaScript büyük çoğunlukla, web tarayıcıyla ilişkili diğer işlemlere konsantre olmuştu. Aslına bakılırsa, dosyalara erişim ve dosya işlemleri, bir web betik dili için (JavaScript gibi) en büyük risk alanını oluşturmaktaydı. Node.js'in gelişimiyle durum biraz farklılaşmıştır.

Yol (Path) Kontrolü

exists() fonksiyonu ile verilen bir yolun (path) mevcut olup olmadığı kontrol edilebilir. Aşağıdaki örnek kodda, mevcut olan '/usr/local/bin' yolu ve mevcut olmayan '/xxx' yolu kontrol ediliyor. İlki için true (doğru), ikinci içinse false (yanlış) sonucu elde edilmektedir.

var fs = require('fs'); 

fs.exists('/usr/local/bin', function(exists) {
console.log('exists:', exists);
});

fs.exists('/xxx', function(exists) {
console.log('exists:', exists);
});

/usr/local/bin dizini mevcut olduğu için, konsola true (doğru), /xxx dizini mevxut olmadığı için konsola false (yanlış) değeri yazılmıştır.


Dosya Sistemi (File System) Modülü

Öntanımlı olarak, Node.js kurulumları içinde, dosya sistemi modülü (file system module) mevcut. fs adı verilen bu modül, Node.js’teki dosya işlemleri için bir temel çerçeve oluşturur. Aşağıda verilen örnek program, bellekte bulunan bir metin dosyasının içeriğini konsolda listeler.
exists() fonksiyonu belirtilen dosyanın mevcut olup olmadığını kontrol eder. Mevcutsa true, değilse false değerini gönderir.
stat() fonksiyonu ise belirtilen dosyanın byte cinsinden uzunluğunu bulur.
open() fonksiyonu ise dosyayı açmak için kullanılır. 'r' sembolü dosyanın okuma (read) amacıyla açıldığını gösterir. open() fonksiyonu, açılan yeni dosyaya erişimi gerçekleştirmek için, bir dosya tanımlayıcısı (file descriptor - fd) oluşturur.
Ayrıca dosyanın içeriğini tutmak için de bir tampon alan (buffer) tanımlanmaktadır. Tampon alanın büyüklüğü stats.size değişkeninde saklanan dosyanın büyüklüğüne eşitlenir. Sonra read() fonksiyonu ile dosya tampon alan içine okunur.
Tampon alan, bu durumda dosyadan okunan orijinal veriyi içermektedir. Dosyayı görüntüleyebilmek için, veri önce UTF-8 kodu ile oluşturulmuş string'e dönüştürülür, sonra da konsola yazılır. İşlem bitince dosya kapatılır. Programın listesi aşağıdadır:

var fs = require("fs");
var DOSYA_ADI = "gyDosya.txt";

fs.exists(DOSYA_ADI, function(exists) {

  if (exists) {
    fs.stat(DOSYA_ADI, function(error, stats) {
      fs.open(DOSYA_ADI, "r", function(error, fd) {
        var buffer = new Buffer(stats.size);

        fs.read(fd, buffer, 0, buffer.length, null, function(error, bytesRead, buffer) {
          var VERI = buffer.toString("utf8", 0, buffer.length);

          console.log(VERI);
          fs.close(fd);
        });
      });
    });
  }
});

Dosyadan okuma yapan örnek program, aşağıdaki gibi çalıştırılırsa, dosya içeriği konsolda görüntülenecektir.

Open() Fonksiyonu

open() fonksiyonu, dosya ile bellek (memory) arasındaki iletişim kanalını aktif hale getirir. open() fonksiyonunun parametreleri, dosya adı ve dosyanın açılış modudur. Dosya adı, yolu ile belirtilebilir. Dosyanın açılış moduyla ilgili parametre değerleri ise aşağıdaki tabloda verilmiştir:
ParametreAnlamı
rDosya, okuma amacıyla açılıyor.
r+Dosya, okuma ve yazma için açılıyor. Dosya pozisyon göstergesi en başa alınır.
wDosya, yazma amacı ile açılıyor. O anda mevcut değilse oluşturulur; mevcutsa içeriği silinerek pozisyon en başa alınır.
w+Hem okuma hem yazma yapılabilir.
aDosya en sondan itibaren veri ekleme amacı ile açılır.
a+Ekleme ve okuma amacı ile açılır.
Aşağıdaki op.js adlı program, open komutunu test ediyor:,

var fs = require("fs");

fs.open("gyDosya.txt","r", function(err, fd) {
if (err) consol.log("DOSYA ACILAMIYOR");
else console.log("DOSYA ACILDI");
});

Programın çıktısı ise aşağıda verilmiştir:

readFile Fonksiyonu

Bir dosyanın tümünü birden, aynı anda tampon belleğe okumak için, readFile fonksiyonu kullanılacaktır. Bu durumda program çok basit hale gelir:

var fs = require("fs");

fs.readFile("gyDosya.txt", "utf8", function(hata, veri) {
  console.log(veri);
});

op.js adıyla sakladığınız programı çalıştırınca aşağıdaki sonuç elde ediliyor:


Dosyaya Bilgi Kaydetme - writeFile Komutu

Node.js'te bir dosyaya bilgi kaydetmek için, writeFile fonksiyonu kullanılabilir. Aşağıdaki örnekte, Node.js programında gyDosya.txt dosyası üzerine yeni veri yazılarak içerik değiştiriliyor.

var fs = require('fs');
fs.writeFile('gyDosya.txt', 'Turkcell Gelecegi Yazanlar' , function (err) {
  if (err) return console.log(err);
  console.log('gyDosya.txt NIN ICERIGI DEGISTI');
});

fs.readFile("gyDosya.txt", "utf8", function(hata, veri) {

console.log(veri);
});

Programı op.js adı ile oluşturduk ve sakladık.
Daha sonra, op.js programını

node op.js

komutuyla çalıştırdık. Dosyanın içeriğini 'Turkcell Gelecegi Yazanlar' olarak değiştirdik ve görüntüledik.


Dosya ile İlişkili İstatistiksel Bilgiler

Birçok durumda, dosyanın boyutu, oluşturulduğu tarih, dosya üzerindeki izinler gibi istatistiki bilgilere ihtiyaç duyulabilir. Bu amaçla, Node.js'te,

fs.stat

fonksiyonu kullanılabilir. Aşağıdaki kodu st.js adıyla oluşturun ve çalıştırın.

var fs = require('fs'); 
fs.stat('/usr/local/bin/gyDosya.txt', function(err, stats) {
if (err) { throw err;}
console.log(stats); });

gyDosya.txt isimli dosyanızın içeriğine göre aşağıdaki bilgileri elde edeceksiniz:

fs.stat() fonksiyonu, stats sınıfının bir örneğini çağırır. Bununla ilişkili olarak, aşağıdaki özelliklerden herhangi birini kullanabilirsiniz.
Fonksiyon Adıİşlevi
stats.isFile()Dosya bir dizin adı, soket, sembolik link ya da cihaz olmayıp, standart bir dosyaysa true değerini, aksi takdirde false değerini gönderir.
stats.isDirectory()Dosya adı bir dizine aitse true, aksi halde false değerini gönderir.
stats.isBlockDevice()Dosya adı bir blok cihazına aitse true, aksi halde false değerini gönderir.
stats.isCharacterDevice()Dosya adı, bir karakter tipi cihaza aitse true, aksi halde false değerini gönderir.
stats.isSymbolicLink()Dosya adı bir sembolik link ise true, aksi halde false değerini gönderir.
stats.isFifo()Dosya adı bir FIFO (Bir UNIX pipe'ı) ise true, aksi halde false değerini gönderir.
stats.isSocket()Dosya adı bir UNIX alana ait bir soketse true, aksi halde false değerini gönderir.

Örnek: stats.isFile() fonksiyonunun kullanılışı


Aşağıdaki programı yazın ve çalıştırın.

var sys = require('sys');
var fs = require("fs");

//Buraya dosyanızın yolunu tanımlayın.
var p1 = "/Users/cansu/Desktop/gyDosya.txt";

fs.stat(p1, function (error, stats) {
  if (error) throw error;
  console.log("file:" + p1 + "isFile = " + stats.isFile());

});

Programın çıktısı aşağıdadır:

gyDosya.txt normal bir dosya olduğu için ve mevcut olduğu için 'true' mesajı alınıyor.

Verilen Bir Dizin İçindeki Dosyaların İsimlerini Listelemek

Aşağıdaki örnek Node.js koduyla, o anda çalışılan aktif dizindeki tüm dosya isimleri listeleniyor. O andaki aktif dizinse, '.' sembolleriyle belirtiliyor.

var fs = require('fs');
fs.readdir('.', function (err, files) {
 if (err)
    throw err;
 for (var index in files) {
    console.log(files[index]);
 }
 });

Programın çıktısı ise aşağıdadır:

Bir Dosyanın Adını Değiştirmek: Rename Fonksiyonu

Aşağıdaki kodla, gyDosya.txt dosyasının adı test.txt olarak değiştiriliyor.

var fs = require('fs');
fs.rename('/usr/local/bin/gyDosya.txt', '/usr/local/bin/test.txt', function (err) {
  if (err) throw err;
  fs.stat('/usr/local/bin/test.txt', function (err, stats) {
    if (err) throw err;
    console.log('stats: ' + JSON.stringify(stats));
  });
});

Aşağıdaki ekran görüntüsünde de görülebileceği üzere değişiklik işlemi tamamlandı:

Yorumlar

Bu blogdaki popüler yayınlar

İç İçe Döngüler

CSS Bir Elemanın Genişliği ve Yüksekliği

JavaScript Dilinde Fonksiyon Çağırma Teknikleri