Узел: список файлов в каталоге

Введение Работа с файлами - обычная задача для любого языка программирования. Для работы с файлами нам необходимо знать их местонахождение. Один из наиболее фундаментальных способов взаимодействия с файлами - перечисление файлов в каталоге. В этой статье мы будем использовать Node.js и встроенный модуль fs, а также модуль дерева каталогов из NPM для вывода списка всех файлов из каталога. Мы прочитаем каталог, файлы, расположенные в том же месте, где находится наш файл app.js: 10.09.2020 13:27 332 app

Вступление

Работа с файлами - обычная задача для любого языка программирования. Для работы с файлами нам необходимо знать их местонахождение. Один из наиболее фундаментальных способов взаимодействия с файлами - перечисление файлов в каталоге.

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

Мы прочитаем каталог files , расположенный в том же месте, app.js находится наш файл app.js:

 09/10/2020 01:27 PM 332 app.js 
 09/10/2020 01:24 PM <DIR> files 

Справочник содержит:

 files 
 │ anotherDirectory 
 │ └── fileInDirectory.txt 
 └── textFile.txt 
 └── anotherTextFile.txt 

дерево каталогов

directory-tree - удобный модуль NPM, который берет на себя эту задачу за нас и красиво форматирует вывод. Для начала установим его:

 $ npm install directory-tree 

Теперь давайте импортируем его в наш скрипт и укажем местоположение нашего каталога:

 const dirTree = require("directory-tree"); 
 
 const tree = dirTree('./files/'); 
 console.log(tree); 

Константа tree теперь содержит информацию, к которой мы хотели бы получить доступ. Этот код приводит к:

 { 
 path: './files/', 
 name: 'files', 
 children: [ 
 { 
 path: 'files\\anotherDirectory', 
 name: 'anotherDirectory', 
 children: [Array], 
 size: 8, 
 type: 'directory' 
 }, 
 { 
 path: 'files\\anotherTextFile.txt', 
 name: 'anotherTextFile.txt', 
 size: 2218, 
 extension: '.txt', 
 type: 'file' 
 }, 
 { 
 path: 'files\\textFile.txt', 
 name: 'textFile.txt', 
 size: 7, 
 extension: '.txt', 
 type: 'file' 
 } 
 ], 
 size: 2233, 
 type: 'directory' 
 } 

Мы также можем указать расширения, по которым мы хотели бы фильтровать, используя dirTree() :

 const tree = dirTree('./files/', {extensions:/\.js$/}); 
 console.log(tree); 

Это вернет пустой результат, поскольку в каталоге files

fs.readdir ()

Проще всего читать файлы из каталога без внешних модулей с помощью функции readdir() . Он асинхронный и возвращает массив, содержащий имена файлов в указанном вами каталоге.

Давайте продолжим и перечислим файлы из каталога files

 const directory = './files/'; 
 const fs = require('fs'); 
 
 fs.readdir(directory, (err, files) => { 
 files.forEach(file => { 
 console.log(file); 
 }); 
 }); 

Здесь мы указали directory , указывающую на files , после чего мы импортировали модуль fs

Затем мы предоставили directory функции readdir() и зарегистрировали их имя с помощью обратного вызова. Это приводит к:

 anotherDirectory 
 anotherTextFile.txt 
 textFile.txt 
 textFile.txt - Shortcut.lnk 

Примечание. Функция readdir() также читает каталоги, но без указания того, каталог это или файл. Файл без расширения в этом случае выглядит так же, как и каталог.

Однако мы можем использовать fs.lstatSync() чтобы помочь нам в этом:

 const directory = './files/'; 
 const path = require('path'); 
 const fs = require('fs'); 
 
 fs.readdir(directory, (err, files) => { 
 files.forEach(file => { 
 if (fs.lstatSync(path.resolve(directory, file)).isDirectory()) { 
 console.log('Directory: ' + file); 
 } else { 
 console.log('File: ' + file); 
 } 
 }); 
 }); 

Используя isDirectory() , мы проверили, является ли то, что мы встречаем по заданному пути, каталогом или файлом. Теперь это приводит к:

 Directory: anotherDirectory 
 File: anotherTextFile.txt 
 File: file 
 File: textFile.txt 

fs.readdirSync ()

Функция readdirSync() практически такая же, как readdir() , но читает синхронно, а не асинхронно.

Он работает так же, как и предыдущий подход - просто выполняет операцию синхронно:

 const directory = './files/'; 
 const path = require('path'); 
 const fs = require('fs'); 
 
 fs.readdirSync(directory).forEach(file => { 
 if (fs.lstatSync(path.resolve(directory, file)).isDirectory()) { 
 console.log('Directory: ' + file); 
 } else { 
 console.log('File: ' + file); 
 } 
 }); 

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

 Directory: anotherDirectory 
 File: anotherTextFile.txt 
 File: file 
 File: textFile.txt 

Заключение

В этой статье мы рассмотрели несколько способов перечисления файлов в каталоге в Node.js. Мы начали с directory-tree , пакета NPM, созданного для этой цели, после чего мы использовали встроенный fs и его функции readdir() и readdirSync() для вывода списка файлов.

comments powered by Disqus