В узле модуль fs относится к «модулю файловой системы», который используется для работы с файлами. Большинство API модуля fs предоставляют три метода работы: 1. Синхронная операция с файлом: код будет заблокирован и не будет продолжать выполняться. 2. Операция с файлом асинхронной функции обратного вызова: код не будет заблокирован, и необходимо использовать функцию обратного вызова; Когда результат генерируется, выполняется функция обратного вызова. 3. Файл операции асинхронного обещания: код не будет заблокирован, и обещание будет возвращено путем вызова операции метода через fs.promises.
Операционная среда этого руководства: система Windows 7, nodejs версии 16, компьютер DELL G3.
Модуль файловой системы (сокращенно fs) позволяет нам получать доступ к файловой системе на нашем компьютере и взаимодействовать с ней.
Модуль fs — это модуль, официально предоставляемый Node.js для операционных файлов. Он предоставляет ряд методов и свойств для удовлетворения потребностей пользователей в работе с файлами.
Метод fs.readFile(), используемый для чтения содержимого указанного файла.
Метод fs.writeFile(), используемый для записи содержимого в указанный файл, если вы хотите использовать его в коде JavaScript.
Модуль файловой системы — это основной модуль Node.js. Это означает, что нам не нужно его устанавливать. Единственное, что нам нужно сделать, это импортировать модуль fs в отдельный файл.
Итак, вверху файла добавьте:
const fs = require('fs')Теперь мы можем вызвать любой метод из модуля файловой системы, используя префикс fs.
В качестве альтернативы мы можем просто импортировать необходимые методы из API fs следующим образом:
const { writeFile, readFile } = require('fs')Примечание. Для удобства нам также необходимо импортировать модуль пути. Это еще один основной модуль Node.js, который позволяет нам работать с путями к файлам и каталогам.
После импорта модуля fs добавьте:
константный путь = требуется («путь»)При использовании модуля файловой системы модуль пути не требуется. Но нам это очень помогает!
Файловые операции модуля fs обычно поддерживают два API: синхронный и асинхронный, а также включают функции обратного вызова и формы Promsie. За синхронизацией обычно следует слово «синхронизация».
Большинство API модуля fs предоставляют три метода работы:
Синхронная работа файлов: код будет заблокирован и не продолжит выполняться
Файл операции асинхронной функции обратного вызова: код не будет заблокирован, необходимо передать функцию обратного вызова, и при получении результата функция обратного вызова выполняется.
Файлы операций асинхронного обещания: код не будет блокироваться. Вызов операций метода через fs.promises вернет обещание, которое затем можно будет обработать и перехватить.
Обратите внимание, что все методы fs по умолчанию асинхронны. Однако мы можем использовать синхронизированную версию, добавив Sync в конец метода.
Например, синхронная версия метода writeFile — writeFileSync. Синхронные методы завершают код синхронно, поэтому блокируют основной поток. Блокировка основного потока в Node.js считается плохой практикой, и нам не следует этого делать.
Поэтому ниже мы будем использовать асинхронные методы в модуле файловой системы.
Чтобы записать файл из приложения Node.js, используйте метод writeFile.
Метод writeFile принимает как минимум следующие параметры:
Обратный вызов содержимого имени файлаЕсли указанный файл уже существует, он заменяет старое содержимое содержимым, которое вы предоставляете в качестве аргумента. Если указанный файл не существует, создается новый файл.
После импорта модулей fs и path напишите в файле следующий код:
fs.writeFile('content.txt', 'Вся работа и отсутствие игр делают Джека скучным мальчиком!', err => { if (err) throw errprocess.stdout.write('Успешно создано!')})Приведенный выше код создаст новый файл с именем content.txt и добавит в качестве содержимого текст «Все работает и не играет, делает Джека скучным мальчиком!». Если есть какие-либо ошибки, функция обратного вызова выдаст эту ошибку. В противном случае на консоль будет выведено сообщение о том, что файл создан успешно.
Существуют и другие варианты writeFile, например:
fs.writeFileSync — синхронная запись файлов fsPromises.writeFile — запись файлов с использованием API на основе PromiseОзнакомьтесь с этой сутью: https://gist.github.com/catalinpit/571ba06c06214b5c8744036c6500af92.
Перед чтением файла необходимо создать и сохранить путь к файлу. Здесь удобен путь модуля path.
Используя метод пути из модуля соединения, вы можете создать путь к файлу следующим образом:
const filePath = path.join(process.cwd(), 'content.txt')Первый параметрprocess.cwd() возвращает текущий рабочий каталог. Теперь, когда у вас есть путь к файлу, вы можете прочитать его содержимое.
Напишите в файле следующий код:
fs.readFile(filePath, (ошибка, содержимое) => { if (ошибка) выдать ошибку процесса.stdout.write(содержание)})Метод readFile принимает как минимум два параметра:
Обратный вызов пути к файлуЕсли есть ошибка, то выдаст ошибку. В противном случае он печатает содержимое файла в терминале.
Существуют и другие варианты readFile, например:
fs.readFileSync — синхронная запись в файл fsPromises.readFile — запись в файл с использованием API на основе PromiseОзнакомьтесь с этой сутью: https://gist.github.com/catalinpit/badc2a539a44412892a0e05a9575d54d
Отображение файла в каталоге очень похоже на чтение содержимого файла. Однако вместо пути к файлу укажите текущий рабочий каталог (мы можем передать любой другой каталог).
Затем передайте функцию обратного вызова для обработки ответа. Напишите в файле следующий код:
fs.readdir(process.cwd(), (ошибка, файлы) => { if (ошибка) выдать ошибку console.log(files)})До сих пор мы использовали процесс.stdout.write только для вывода содержимого на терминал. Однако вы можете просто использовать console.log, как показано в приведенном выше фрагменте кода.
Если мы запустим приложение, мы должны получить массив, содержащий все файлы в каталоге.
Ознакомьтесь с этой сутью: https://gist.github.com/catalinpit/f82c4e6ae3acd5d97efdecb0bc67979e
Модуль файловой системы имеет метод, позволяющий удалять файлы. Однако важно отметить, что это работает только для файлов, а не для каталогов.
Когда метод unlink вызывается с указанием пути к файлу в качестве параметра, он удаляет файл. Добавьте в файл следующий фрагмент кода:
fs.unlink(filePath, error => { if (error) throw error console.log('Файл был удален!')})Если вы повторно запустите код, ваши файлы будут удалены!
Ознакомьтесь с этой сутью: https://gist.github.com/catalinpit/b1201434218c400f77e042109bfce99e
Мы можем создать каталог асинхронно, используя метод mkdir. Напишите в файле следующий код:
fs.mkdir(`${process.cwd()}/myFolder/ SecondFolder`, { recursive: true }, (err) => { if (err) throw err console.log('Папка создана успешно!') })Сначала создайте новую папку в текущем рабочем каталоге. Как упоминалось ранее, вы можете получить текущий рабочий каталог из объекта процесса, используя метод cwd().
Затем передайте папку или папки, которые необходимо создать. Однако это не означает, что вам нужно создать новую папку в текущем рабочем каталоге. Вы можете создавать их где угодно.
Теперь второй параметр — это рекурсивная опция. Если для него не установлено значение true, создать несколько папок невозможно. Если для параметра рекурсии установлено значение false, приведенный выше код выдаст ошибку. Попробуйте!
Однако если вы хотите создать только папку, нет необходимости устанавливать для параметра рекурсии значение true.
Следующий код работает нормально!
fs.mkdir(`${process.cwd()}/myFolder`, err => { if (err) throw err console.log('Папка создана успешно!')});Поэтому я хотел бы подчеркнуть использование рекурсивности. Вам необходимо установить значение true, если вы хотите создавать папки внутри папок. Он создаст все папки, даже если они не существуют.
С другой стороны, если вы хотите создать только папку, вы можете оставить значение false.
Ознакомьтесь с этой сутью: https://gist.github.com/catalinpit/09bad802541102c0cce2a2e4c3985066.
Логика удаления каталога аналогична созданию каталога. Если вы посмотрите на код, написанный для создания каталога, и на код ниже, вы увидите сходство.
Поэтому напишите в файле следующий код:
fs.rmdir(`${process.cwd()}/myFolder/`, { recursive: true }, err => { if (err) throw err console.log('Папка успешно удалена!')})Используйте метод rmdir из модуля файловой системы и передайте следующие параметры:
Каталог для удаления, рекурсивный обратный вызов свойстваЕсли для свойства recursive установлено значение true, папка и ее содержимое удаляются. Важно отметить, что вам необходимо установить для этого параметра значение true, если папка содержит контент. В противном случае вы получите ошибку.
Следующий фрагмент кода работает только в том случае, если папка пуста:
fs.rmdir(`${process.cwd()}/myFolder/`, err => { if (err) throw err console.log('Папка успешно удалена!')})Если в myFolder есть другие файлы и/или папки, произойдет ошибка, если {recursive: true} не будет передано.
Важно знать, когда использовать рекурсивный вариант, а когда не избежать проблем.
Ознакомьтесь с этой сутью: https://gist.github.com/catalinpit/a8cb6aca75cef8d6ac5043eae9ba22ce.
Используя модуль fs, вы можете переименовывать каталоги и файлы. В следующем фрагменте кода показано, как это сделать с помощью метода переименования.
// Переименовываем каталог fs.rename(`${process.cwd()}/myFolder/ SecondFolder`, `${process.cwd()}/myFolder/newFolder`, err => { if (err) throw err console .log('Переименование каталога!')});//Переименовываем файл fs.rename(`${process.cwd()}/content.txt`, `${process.cwd()}/newFile .txt` , err => { if (err) throw err console.log('Файл переименован!')});Метод переименования содержит три параметра:
Первый параметр — это существующая папка/файл, а второй параметр — обратный вызов нового имени.Итак, чтобы переименовать файл или каталог, нам нужно передать имя текущего файла/каталога и новое имя. После запуска приложения имена каталогов/файлов должны обновиться.
Обратите внимание: если новый путь уже существует (например, новое имя файла/папки), он будет перезаписан. Поэтому постарайтесь не перезаписать существующие файлы/папки по ошибке.
Ознакомьтесь с этой сутью: https://gist.github.com/catalinpit/5c3e7c6ae39d09996ff67175a719122e
Мы также можем добавить новое содержимое в существующий файл, используя метод AppendFile.
Если мы сравним два метода writeFile и AppendFile, мы увидим, что они похожи. Передайте путь к файлу, содержимое и обратный вызов.
fs.appendFile(filePath, 'nВся работа и отсутствие игр делает Джека скучным мальчиком!', err => { if (err) throw err console.log('Вся работа и отсутствие игр делает Джека скучным мальчиком!')} )Приведенный выше фрагмент кода демонстрирует, как добавить новое содержимое в существующий файл. Если вы запустите приложение и откроете файл, вы должны увидеть внутри новое содержимое.