Menu

Node.js Dosya Okuma: fs.readFile, readFileSync, Promise

Node.js'te bir dosyayı fs.readFile (callback), fs.readFileSync ya da fs/promises içindeki await readFile ile oku. String almak için 'utf8' ver, dosya yoksa ENOENT hatasını yönet.

Bu sayfada çalıştırılabilir editörler var. Düzenle, çalıştır ve sonucu anında gör.

fs.readFile(path, 'utf8', callback) bütün bir dosyayı okur ve içeriğini callback'e string olarak verir. fs.readFileSync(path, 'utf8') string'i doğrudan döndürür ve okumanın bitmesini bekler, fs/promises içindeki await readFile(path, 'utf8') ise aynısını bloklamadan yapar. 'utf8' değerini vermezsen metin yerine ham byte'lardan oluşan bir Buffer alırsın.

Önce readFile called yazdırılır: readFile yalnızca okumayı başlatır ve callback içerik hazır olduğunda çalışır. 'utf8', kısmını sil ve tekrar çalıştır: callback dosyanın ham byte'larını, <Buffer 42 75 79 20 6d 69 6c 6b 0a 43 61 6c 6c 20 41 64 61> değerini alır.

readFile, readFileSync ve fs/promises karşılaştırması

Üçü de aynı dosyayı okur. Sonucu nasıl aldığın ve programın geri kalanının bekleyip beklemediği konusunda farklıdırlar.

Senkron satır önce yazdırılır, çünkü o dönene kadar başka hiçbir şey çalışmaz. Diğer ikisi ana koddan sonra, okumaları hangi sırayla tamamlanırsa o sırayla biter.

readFileSyncreadFile (callback)fs/promises readFile
Ne döndürürİçeriğiundefinedİçeriğin promise'ini
Programı bloklar mıEvetHayırHayır
HatalarFırlatılır, try/catch kullanİlk callback argümanıReject edilen promise, await ile try/catch
Nerede kullanılırAçılış kodu ve script'lerEski callback'li kodYeni kod

Açılışta bir config okurken ya da kısa bir script'te readFileSync kullan. Bir sunucuda senkron okuma disk çalışırken diğer bütün istekleri durdurur, bu yüzden orada promise sürümünü kullan. O API'nin geri kalanını fs/promises sayfası anlatıyor.

Eksik bir dosyayı yönet (ENOENT)

Dosya yoksa hatanın code: 'ENOENT' değeri olur ("error, no entry", yani böyle bir girdi yok). Eksik bir dosyayı izin sorunu gibi diğer hatalardan ayırmak için err.code değerini kontrol et.

İlk çağrı dosya bulamaz ve default settings değerine döner; ikincisi dark mode okur. Diğer hataları tekrar fırlatmak, gerçek sorunları sessizce varsayılanları kullanmak yerine görünür tutar.

fs.existsSync: neden okumayı doğrudan denemelisin

fs.existsSync(path) true ya da false döndürür ve okumadan önce kontrol etmek cazip gelir:

if (fs.existsSync('data.txt')) {
    const text = fs.readFileSync('data.txt', 'utf8');
}

Bu, bir adımın yeteceği yerde iki adımdır ve dosya ikisinin arasında silinebilir, yani okuma yine de hata fırlatabilir. Yukarıdaki gibi okumayı dene ve ENOENT hatasını yönet. existsSync, yalnızca bir şeyin var olup olmadığını bilmen gerektiğinde ve onu açmayacağında uygundur, örneğin bir klasör oluşturup oluşturmayacağına karar verirken.

JSON dosyası okuma

Metni oku, sonra JSON.parse ile parse et. Sözdizimi hatası olan bir dosya SyntaxError fırlatır, bu yüzden onu aynı try içinde tut.

Çıktı 3001 ve boolean olur: parse ettikten sonra değerler JSON tiplerini alır. require('./config.json') da çalışır, ama sonucu önbelleğe alır, yani dosya değişse bile ikinci require eski nesneyi döndürür.

Dosyayı satır satır okuma

Belleğe sığan bir dosya için onu bütün olarak oku ve yeni satır karakterine göre böl. Sondaki yeni satırın bıraktığı boş string'i filtrele.

Bölme 4 eleman verir, sonuncusu boştur, bu yüzden döngü numaralı üç satır yazdırır. Windows'ta yazılmış dosyalar satırları \r\n ile bitirir; ikisini de karşılamak için /\r?\n/ ile böl.

Birkaç gigabaytlık bir log belleğe sığmaz. Onun yerine stream kullan, böylece bellekte aynı anda yalnızca bir satır tutulur:

const fs = require('fs');
const readline = require('readline');

async function main() {
    const rl = readline.createInterface({
        input: fs.createReadStream('big.log'),
        crlfDelay: Infinity,
    });
    for await (const line of rl) {
        console.log(line);
    }
}
main();

Sık yapılan hatalar

Sonucu callback'in dışında kullanmak. const text = fs.readFile(...) değeri undefined olur. İçerik yalnızca callback'in içinde ya da await sonrasında vardır.

Encoding'i unutmak. 'utf8' olmadan bir Buffer alırsın ve data.split('\n'), data.split is not a function fırlatır. Metin istediğin her durumda encoding'i ver.

Yanlış klasöre göre göreli path'ler. 'data.txt', node komutunun başlatıldığı yerde aranır. Script'inin yanında duran bir dosya için path.join(__dirname, 'data.txt') kullan.

Sıkça Sorulan Sorular

fs.readFile neden undefined döndürüyor?

fs.readFile içeriği döndürmez. Okumayı başlatır ve callback'ini daha sonra (err, data) ile çağırır. Veriyi callback'in içinde kullan, readFileSync çağır ya da promise sürümünü await et.

Node, 'data.txt' gibi göreli bir path'i nerede arar?

Script'in klasöründe değil, mevcut çalışma dizininde, yani node komutunu çalıştırdığın klasörde. Script'in yanındaki bir dosyayı okumak için path'i path.join(__dirname, 'data.txt') ile oluştur.

fs.readFile bir URL'den dosya okuyabilir mi?

Hayır, yalnızca dosya sisteminden okur. HTTP üzerinden bir dosya almak için fetch kullan, ardından await res.text() çağır.

readFile ne kadar büyük bir dosyayı kaldırır?

Bütün dosyayı belleğe yükler, bu yüzden config'ler, şablonlar ve küçük veri dosyaları için uygundur. Yüzlerce megabaytlık dosyaları fs.createReadStream ile parça parça oku.

Coddy programlama dilleri çizimi

Coddy ile kodlamayı öğren

Başla