Как получить размер файла в Node.js: освоение модуля fs

Получить размер файла — простая задача, но в зависимости от ваших потребностей есть разные способы сделать это. В Node.js fs модуль предоставляет мощный набор инструментов для работы с файлами.

Чтобы получить размер любого файла в Node.js с помощью fs модуля, вызовите fs.stat() метод, указав путь к любому файлу. Он вернет объект статистики файла, включая size свойство. Этот метод дает размер файла в байтах.

В этом посте мы рассмотрим различные способы получения размера файла в Node.js, включая асинхронные и синхронные методы. Вы также увидите, как преобразовать размер файла в килобайты, мегабайты или гигабайты , разделив размер в байтах на соответствующий коэффициент.

Получение размера файла в Node.js с помощью модуля fs

Вы можете получить размер файла, используя 2 метода модуля fs. Метод fs.statSync() работает синхронно, а fs.stat() метод работает асинхронно.

Давайте посмотрим, как мы можем использовать оба метода на примерах:

Использование fs.statSync() для синхронного получения размера файла

Чтобы fs.statSync() получить размер файла, вы можете передать путь к файлу в качестве аргумента метода. Метод вернет объект, содержащий информацию о файле.

Вы можете получить доступ к размеру файла, обратившись к size свойству объекта. Вы получите значение в формате байтов.

const fs = require('fs')

const getFileSize = (path) => {
    try {
        const stats = fs.statSync(path)

        console.log(stats)

        return stats.size
    } catch (error) {
        // Handle error here
        console.log(error)
    }
}

const size = getFileSize('./images/banners.jpg')

console.log(size)
// 45712 bytes

Во-первых, вам нужно запросить fs модуль внутри вашего файла сценария. Здесь у меня есть getFielSize() функция, которая принимает путь (путь к файлу) в качестве аргумента.

Для обработки ошибок используйте try...catch блок. Если по этому пути нет такого файла или возникла непредвиденная ошибка, вы можете обработать ее внутри catch блока.

Вы можете использовать этот путь при вызове fs.statSync() метода. Объект stats, возвращаемый методом, fs.statSync() содержит различные свойства файла. Если вы отметите этот объект, вы увидите эти свойства.

{
  dev: 16777234,
  mode: 33188,
  nlink: 1,
  uid: 501,
  gid: 20,
  rdev: 0,
  blksize: 4096,
  ino: 10199555,
  size: 45712,
  blocks: 96,
  atimeMs: 1678257791675.1821,
  mtimeMs: 1664459737005.8877,
  ctimeMs: 1678257789764.474,
  birthtimeMs: 1664459736455.8765,
  atime: 2023-03-08T06:43:11.675Z,
  mtime: 2022-09-29T13:55:37.006Z,
  ctime: 2023-03-08T06:43:09.764Z,
  birthtime: 2022-09-29T13:55:36.456Z
}

Как видите, этот объект содержит size свойство. Значение этого size свойства — это размер вашего файла в байтах. Я возвращаю это значение из getFileSize() функции.

Когда я вызываю эту функцию с указанием пути к файлу, она возвращает мне размер файла. Вы можете конвертировать этот размер в байтах в другие форматы, такие как килобайты, мегабайты, гигабайты и т. д.

В этом примере я использую файл изображения, но вы можете использовать эту функцию с файлами любого типа.

Важно знать, что существует проблема с использованием синхронного метода. Когда вы вызываете синхронный метод, программа будет ждать завершения метода, прежде чем продолжить работу со следующей строкой кода.

Это означает, что он заблокирует выполнение всей программы до ее завершения. Это может вызвать проблемы с производительностью и замедлить работу вашего приложения, особенно если вы работаете с большими файлами или выполняете трудоемкие задачи.

Вот почему лучше использовать как можно больше асинхронных методов для повышения производительности вашего приложения.

Использование fs.stat() для асинхронного получения размера файла

Этот fs.stat() метод можно использовать для асинхронного получения статистики файла, что означает, что он не будет блокировать цикл событий. Это рекомендуемый способ получения размера файла в Node.js, поскольку он неблокируется и более эффективен, чем синхронные методы.

Вызвать этот метод можно двумя способами:

  • Использование функции обратного вызова.
  • Использование синтаксиса Promise и async/await.

Функция обратного вызова

Метод fs.stat() принимает 2 аргумента: путь к файлу и функцию обратного вызова . Внутри этой функции обратного вызова у вас будет доступ к объекту ошибки, если возникнет непредвиденная ошибка, а также к объекту, содержащему информацию о файле.

const fs = require('fs')

const getFileSize = (path, cb) => {
    fs.stat(path, (err, stats) => {
        if (err) {
            // Handle errors here
            console.log(err)
            return
        }

        cb(stats.size)
    })
}

getFileSize('./images/banner.jpg', (fileSize) => {
    console.log(fileSize)
    // 45712 bytes
})

В этом примере у нас есть getFileSize() функция. Мы вызываем fs.stat() метод, используя файл path внутри этой функции. Если есть какая-либо ошибка, вы можете исправить ее здесь.

Если ошибки нет, вы можете извлечь значение размера файла из объекта stats. Затем я передаю это значение функции cb().

Наконец, когда вы вызываете getFileSize() функцию с путем к файлу, вы получите размер этого файла внутри ее функции обратного вызова.

Синтаксис Promise и async/await

Вы можете использовать fs.stat() метод с Promises и синтаксисом async/await , который может упростить код и сделать его более читабельным. Вам потребуется fs модуль из fs/promies вашего файла сценария.

const fs = require('fs/promises')

const getFileSize = async (path) => {
    try {
        const stats = await fs.stat(path)

        return stats.size
    } catch (error) {
        // Handle errors here
        console.log(error)
    }
}

getFileSize('./images/banner.jpg').then((fileSize) => {
    console.log(fileSize)
    // 45712 bytes
})

Здесь у нас есть getFileSize() асинхронная функция. В качестве аргумента он принимает путь к файлу. Мы вызываем fs.stat() метод с await ключевым словом, чтобы дождаться разрешения Promise и получить информацию об этом файле.

Вы можете использовать try...catch блок для обработки любой непредвиденной ошибки.

Когда вы вызываете getFileSize() метод с указанием пути к файлу, вы можете прикрепить then() к нему этот метод. Здесь у вас есть доступ к значению размера файла.

Конвертировать размер файла из байта в КБ, МБ или ГБ

Как видите, fs.stat() метод выдает значение размера файла в байтах. Но часто мы хотим показать значение в других форматах, таких как килобайты (КБ), мегабайты (МБ) или гигабайты (ГБ).

Поэтому вам необходимо преобразовать размер файла из байтов в другие форматы. Это очень легко сделать.

const convertBytes = (fileSize, format = 'kb') => {
    const formats = ['kb', 'mb', 'gb']

    let index = formats.indexOf(format.toLowerCase())

    if (index === -1) {
        index = 0
    }

    const multiplier = index + 1

    return parseFloat((fileSize / 1024 ** multiplier).toFixed(2))
}

Вы можете использовать эту convertBytes() функцию для преобразования ваших байтов в любой из этих форматов. Эта функция принимает значение размера файла в байтах и ​​формат, который вы хотите преобразовать. Затем он вернет отформатированное значение.

const getFileSize = async (path) => {
    try {
        const stats = await fs.stat(path)

        return stats.size
    } catch (error) {
        // Handle errors here
        console.log(error)
    }
}

getFileSize('./images/banner.jpg').then((fileSize) => {
    console.log(fileSize)

    const fileSizeKB = convertBytes(fileSize, 'kb')
    const fileSizeMB = convertBytes(fileSize, 'mb')
    const fileSizeGB = convertBytes(fileSize, 'gb')

    console.log(fileSizeKB)
    console.log(fileSizeMB)
    console.log(fileSizeGB)
})

Теперь вы можете вызвать convertBytes() функцию и передать ей значение fileSize в нужном вам формате.

Заключение

В модуле Node.js есть 2 метода fs.statSync() определения размера файла. Важно выбрать подходящий метод в зависимости от вашего варианта использования.fs.stat()fs

Если вам нужно получить размер файла синхронно, вы можете использовать этот fs.statSync() метод. Однако если вы работаете с большими файлами, лучше использовать асинхронный fs.stat() метод.

Это не будет блокировать основной поток и ускорит ваше приложение. Мне нравится использовать этот fs.stat() метод с Promise и синтаксисом async/await . Потому что он очень чистый, легко читается и поддерживается.

Поскольку вы получите размер файла в байтах, вы также можете преобразовать размер файла в удобочитаемый формат, например КБ, МБ или ГБ.