Node.js’te dosyadan okuma, dosyaya yazma, dosya silme, dizin oluşturma, dizin silme ve vb. işlevleri yerine getirebilmek için “fs” (file system) modülünün eklenmesi gerekir.
1 |
var fs = require("fs") |
Eşzamanlı – Eşzamansız (Synchronous vs Asynchronous)
fs modülündeki her yöntem eşzamanlı ve eşzamansız durumlara sahiptir. Eşzamanlı metotlar yerine eşzamansız metodları kullanmak daha iyidir çünkü eşzamansız metotlar programın çalışması esnasında programı duraklatmaz ve diğer satırlarda çalışabilir. metin.txt adındaki dosyayı hem eşzamansız hem de eşzamanlı bir şekilde okuyalım.
1 2 |
Merhaba Node.js Bir metin dosyasi |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
var fs = require("fs"); // Eszamansiz okuma fs.readFile('metin.txt', function (err, data) { if (err) { return console.error(err); } console.log("Eszamansiz okuma: " + data.toString()); }); // Eszamanli okuma var data = fs.readFileSync('input.txt'); console.log("Eszamanli oku: " + data.toString()); console.log("Program Bitti"); |
Eşzamansız okuma bölümünde kod çalışmaya devam eder. Başka bir deyişle program durdurulmaz. Ancak eşzamanlı bölümündeki kod okuma işlemi bitmeden başka bir işlem çalışmaz. Program çıktısı:
1 2 3 4 5 |
Eszamanli okuma: Merhaba Node.js Bir metin dosyasi Program Bitti Eszamansiz okuma: Merhaba Node.js Bir metin dosyasi |
Dosya Açma
Bundan sonra eşzamansız metotlar kullanılacaktır. Açma işlemi için aşağıdaki metot kullanılır.
1 |
fs.open(path, flags[, mode], callback) |
Parametreler:
- path − Dosya yolu ve dosya ismini içeren bir metin.
- flags − Dosyanın ne amaçla açıldığını gösteren kısım. (Aşağıda tüm durumlar verilmiştir.)
- mode − Dosya modunun bitlerle (izinler) ayarlandığı bölüm. Geçerli değeri 0666, okunabilir ve yazılabilir anlamına gelir.
- callback − Callback fonksiyonu iki argümana (err ve fd) sahiptir.
Flags:
- r − Okuma modunda dosyayı açma. Dosya yoksa hata döndürülür.
- r+ − Dosya okuma ve yazma için açılır. Dosya yoksa hata döndürülür.
- rs − Eşzamanlı modda okumak için dosya açılır.
- rs+ − Eşzamanlı modda hem okuma hemde yazma için dosya açma.
- w − Dosyayı yazma için açma. Dosya yoksa oluşturulur varsa eksisi yerine yeni bir dosya oluşturulur.
- wx − w’ye benzer ama path var ise hata verir.
- w+ − Okuma ve yazma için açma. Dosya yoksa oluşturulur varsa eksisi yerine yeni bir dosya oluşturulur.
- wx+ − w+ gibi ama path bar ise hata verir.
- a − Dosyayı ekleme için açar. Dosya yok ise oluşturur.
- ax − a gibidir, path yok ise hata verir.
- a+ − Dosyayı okuma ekleme için açma. Dosya yok ise oluşturur.
- ax+ − a+ benzer ama path yok ise hata verir.
Bir örnek:
1 2 3 4 5 6 7 8 9 10 |
var fs = require("fs"); // Eszamansiz dosya açma console.log("Dosya acilma basliyor!"); fs.open('metin.txt', 'r+', function(err, fd) { if (err) { return console.error(err); } console.log("Dosya basarili bir sekilde acildi!"); }); |
Dosya Bilgisi Alma
Dosya hakkında bilgi almak için iki parametreli aşağıdaki metot kullanılır.
1 |
fs.stat(path, callback) |
Parametreler:
- path − Dosya yolu ve dosya ismini içeren bir metin.
- callback − Callback fonksiyonu iki argümana (err ve fd) sahiptir.
Bu metodun yanında fs.Stats sınıfı içinde dosya hakkında bilgi alabileceğiz ek metotlar vardır.
- stats.isFile() − Dosya olup olmadığını döndürür.
- stats.isDirectory() − Dizin olup olmadığını döndürür.
- stats.isBlockDevice() − Blok cihazı olup olmadığını döndürür.
- stats.isCharacterDevice() − Karakter cihazı olup olmadığını döndürür.
- stats.isSymbolicLink() − Sembolik bağlantı olup olmadığını döndürür.
- stats.isFIFO() − FIFO dosya tipi olup olmadığını döndürür.
- stats.isSocket() − Soket dosya tipi olup olmadığını döndürür.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
var fs = require("fs"); console.log("Dosya hakkinda bilgi:"); fs.stat('metin.txt', function (err, stats) { if (err) { return console.error(err); } console.log(stats); console.log("Dosyadan basarili bir sekilde bilgi elde edildi!"); // Dosya tipini kontrol et console.log("Dosya mi ? " + stats.isFile()); console.log("Dizin mi ? " + stats.isDirectory()); }); |
Program Çıktısı:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
Dosya hakkinda bilgi: { dev: 1792, mode: 33188, nlink: 1, uid: 48, gid: 48, rdev: 0, blksize: 4096, ino: 4318127, size: 97, blocks: 8, atime: Sun Mar 22 2015 13:40:00 GMT-0500 (CDT), mtime: Sun Mar 22 2015 13:40:57 GMT-0500 (CDT), ctime: Sun Mar 22 2015 13:40:57 GMT-0500 (CDT) } Dosyadan basarili bir sekilde bilgi elde edildi! Dosya mi ? true Dizin mi ? false |
Dosyaya Yazma
Yazma metodu 4 parametre içerir.
1 |
fs.writeFile(filename, data[, options], callback) |
- path − Dosya yolu ve dosya ismini içeren bir metin.
- data − Dosyaya yazılacak olan String veya buffer’dır.
- options − Bir nesne olan bu parametre “encoding, mode, flag” ayarlarını tutar. Encoding’in geçerli değeri utf8, mode geçerli değeri 0666 ve flag geçerli değeri “w”dir.
- callback − Bu callback fonksiyonu sadece yazma hatası olursa hata döndürür.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
var fs = require("fs"); console.log("Varolan bir dosyaya yazma islemi"); fs.writeFile('metin.txt', 'Merhaba yeni satir!', function(err) { if (err) { return console.error(err); } console.log("Veri basarili bir sekilde yazildi!"); console.log("Yazilan veriyi okuyalım."); fs.readFile('metin.txt', function (err, data) { if (err) { return console.error(err); } console.log("Eszamansiz okuma: " + data.toString()); }); }); |
Dosyayı Okuma
6 parametreye sahip olan okuma metodu aşağıdaki gibidir.
1 |
fs.read(fd, buffer, offset, length, position, callback) |
Bu komut parça parça okuma işlemi için uygundur. Eğer tüm dosyayı okumak isterseniz fs.readFile metodunu kullanabilirsiniz.
- fd − fs.open() metodundan dönen değer.
- buffer − Yazılacak verinin buffer’ı.
- offset − Yazılacak verinin başlangıç noktası.
- length − Okunacak byte miktarı. (tamsayı)
- position − Okumaya başlanacak pozisyon değeri. (tamsayı)
- callback − Bu fonksiyon üç argüman alır, (err, bytesRead, buffer).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
var fs = require("fs"); var buf = new Buffer(1024); console.log("Varolan bir dosya acilacak."); fs.open('metin.txt', 'r+', function(err, fd) { if (err) { return console.error(err); } console.log("Dosya acildi!"); console.log("Okuma baslayacak."); fs.read(fd, buf, 0, buf.length, 0, function(err, bytes){ if (err){ console.log(err); } console.log(bytes + " bytes read"); // Okunan veri cikti olarak ekrana yazdiriliyor if(bytes > 0){ console.log(buf.slice(0, bytes).toString()); } }); }); |
Dosya Kapama
fs.read gibi bir işlemden sonra dosya kapatılmalıdır. Bunun için iki parametreli aşağıdaki metot kullanılır.
1 |
fs.close(fd, callback) |
- fd − fs.open() açılan dosyadan dönen değer.
- callback − Bu fonksiyon sadece hata olduğunda bir argüman döndürür. Bu fonksiyonda, işlemin tamamlandığına dair bilgi verilebilir.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
var fs = require("fs"); var buf = new Buffer(1024); console.log("Varolan bir dosya acilacak"); fs.open('input.txt', 'r+', function(err, fd) { if (err) { return console.error(err); } console.log("Dosya basarili bir sekilde acildi!"); console.log("Dosya okuma geciliyor."); fs.read(fd, buf, 0, buf.length, 0, function(err, bytes){ if (err){ console.log(err); } // Sadece okunan byte'lari ekrana yaz. if(bytes > 0){ console.log(buf.slice(0, bytes).toString()); } // Acik dosyayi kapat. fs.close(fd, function(err){ if (err){ console.log(err); } console.log("Dosya basarili bir sekilde kapandi."); }); }); }); |
Dosya Kesme
Dosyanın belirli bir kısmını kesmek için kullanılır.
1 |
fs.ftruncate(fd, len, callback) |
- fd − fs.open() açılan dosyadan dönen değer.
- len − Kesmeden sonra dosyanın boyutu.
- callback − Bu fonksiyon sadece hata olduğunda bir argüman döndürür. Bu fonksiyonda, işlemin tamamlandığına dair bilgi verilebilir.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
var fs = require("fs"); var buf = new Buffer(1024); console.log("Varolan bir dosyayi acma."); fs.open('metin.txt', 'r+', function(err, fd) { if (err) { return console.error(err); } console.log("Dosya basarili bir sekilde acildi!"); console.log("10 byte sonra dosyayı kes"); // Truncate the opened file. fs.ftruncate(fd, 10, function(err){ if (err){ console.log(err); } console.log("Kesme islemi basarili bir sekilde yapildi."); console.log("Ayni dosyayi oku"); fs.read(fd, buf, 0, buf.length, 0, function(err, bytes){ if (err){ console.log(err); } // Sadece okunan byte'i yaz. if(bytes > 0){ console.log(buf.slice(0, bytes).toString()); } // Dosyayi kapat. fs.close(fd, function(err){ if (err){ console.log(err); } console.log("Dosya kapatildi."); }); }); }); }); |
Dosya Silme
Dosya silme işlemi için aşağıdaki metot kullanılır.
1 |
fs.unlink(path, callback) |
- path − Dosya yolu ve dosya ismini içeren bir metin.
- callback − Bu fonksiyon sadece hata olduğunda bir argüman döndürür. Bu fonksiyonda, işlemin tamamlandığına dair bilgi verilebilir.
1 2 3 4 5 6 7 8 9 |
var fs = require("fs"); console.log("Varolan bir dosyayi silme"); fs.unlink('metin.txt', function(err) { if (err) { return console.error(err); } console.log("Dosya basarili bir sekilde silindi!"); }); |
Dizin oluşturma
Dizin oluşturma için aşağıdaki metot kullanılır.
1 |
fs.mkdir(path[, mode], callback) |
- path − Dosya yolu ve dosya ismini içeren bir metin.
- mode − Oluşan dizinin yetkisi ayarlanır. Gecerli degeri 0777’dir.
- callback − Bu fonksiyon sadece hata olduğunda bir argüman döndürür. Bu fonksiyonda, işlemin tamamlandığına dair bilgi verilebilir.
1 2 3 4 5 6 7 8 9 |
var fs = require("fs"); console.log("/tmp/test dizinini olustur"); fs.mkdir('/tmp/test',function(err){ if (err) { return console.error(err); } console.log("Dizin basarili bir sekilde olusturuldu!"); }); |
Dizin İçini Okuma
Dizin içindeki diğer dizinleri ve dosyaları okumak için aşağıdaki metot kullanılır.
1 |
fs.readdir(path, callback) |
- path − Dizin ismi.
- callback − Callback fonksiyonundan iki argüman (err, files) döner. err hata için iken files içinde dizinler ve dosyalar bulunur.
1 2 3 4 5 6 7 8 9 10 11 |
var fs = require("fs"); console.log("/tmp dizinini oku"); fs.readdir("/tmp/",function(err, files){ if (err) { return console.error(err); } files.forEach( function (file){ console.log( file ); }); }); |
Dizin Sil
Dizin silmek için aşağıdaki metot kullanılır.
1 |
fs.rmdir(path, callback) |
- path − Dosya yolu ve dosya ismini içeren bir metin.
- callback − Bu fonksiyon sadece hata olduğunda bir argüman döndürür. Bu fonksiyonda, işlemin tamamlandığına dair bilgi verilebilir.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
var fs = require("fs"); console.log("/tmp/test dizini sil"); fs.rmdir("/tmp/test",function(err){ if (err) { return console.error(err); } console.log("/tmp dizinini oku"); fs.readdir("/tmp/",function(err, files){ if (err) { return console.error(err); } files.forEach( function (file){ console.log( file ); }); }); }); |
Diğer metotlar
Node.js fs modülünden birkaç metodu bu bölümde anlatmaya çalıştım. Ancak, fs modülü içinde çok fazla metot vardır. Bu metotların tümüne Node.js file system dokümanlarından ulaşabilirsiniz. Bu metotlarında girdi ve çıktıları yukarıdaki metotlara benzerlikler göstermektedir.