Как получить список файлов в папке javascript

Обновлено: 03.07.2024

По аналогии с командой dir в MS Windows (а точнее в DOS) или с командой ls в Unix/Linux, мы напишем скрипт на Node.js, реализующий такое же поведение. Он будет получать имя директории и возвращать содержимое директории с некоторой информацией о каждом элементе в этой директории.

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

Этот скрипт получает путь к директории в командной строке (обязательный параметр), а затем перечисляет содержимое этой директории (без рекурсии).

examples/node/read_dir.js

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

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

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

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

Список будет содержать все кроме . (указывает на текущую директорию) и .. (представляет собой родительскую директорию).

Вот как это выглядит:

Подробная информаци о каждом элементе

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

examples/node/list_dir_direct.js

Код достаточно прост и понятен. И он также содержит ошибки, как мы увидим чуть позже.

Внутри коллбека для метода readdir у нас есть цикл for . В этом цикле в каждой итерации мы выводим имя текущего файла (после добавления полного пути директории) - в основном для отладочных целей - и вызываем fs.stat . Этот метод в свою очередь тоже принимает коллбек. Там мы выводим имя файла - в этот раз, как часть результата, и затем выводим размер файла. Мы могли бы вывести все данные о файле как мы это делали в другой статье, но сейчас размера достаточно.

Вывод в консоль:

Отладочный вывод напечатал имена как и ожидалось, но внутри коллбека функции fs.stat() мы снова печатаем одно и тоже имя файла. Сравните результаты:

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

Таким образом, если мы хотим сочетать имя файла и результат вызова функции fs.stat() , тогда мы должны опираться на порядок вызовов. Но можем ли мы полагаться на него? В этом конкретном случае вызова функции для каждого файла в директории это могло бы сработать как мы ожидаем - вызов функций по порядку. Но в случае более сложных операций, особенно, если есть еще и внутренние коллбеки, мы не можем полагаться на то, что функции будут вызваны в нужном нам порядке - в порядке их инициализации.

Следовательно, нам нужен способ передачи параметра file во внутренний коллбек.

Генерация коллбеков

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

Теперь каждый раз, когда мы вызываем fs.stat() , до того как fs.stat() будет реально выполнен, JavaScript будет вызывать функцию generate_callback() с текущим значением переменной file . Generate_callback будет создавать новую функцию и затем возвращать ее нам. Эта вновь созданная функция станет коллбеком для метода fs.stat() .

examples/node/list_dir_generate.js

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

Безимянные генераторы функций

В заключение давайте посмотрим решение без использования внешней функции generate_callback .

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

22 ответа

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

Второй является синхронным, он вернет массив имен файлов, но остановит дальнейшее выполнение вашего кода, пока не завершится процесс чтения.

IMO самый удобный способ выполнить такие задачи - использовать инструмент glob. Вот глобальный пакет для node.js. Установить с

Затем используйте подстановочный знак для сопоставления имен файлов (пример взят с сайта пакета)

Асинхронное использование с mz / fs

Модуль mz предоставляет многообещающие версии библиотеки базовых узлов. Использовать их просто. Сначала установите библиотеку .

В качестве альтернативы вы можете написать их в асинхронных функциях в ES7:

Обновление для рекурсивного листинга

Некоторые пользователи указали желание увидеть рекурсивный список (хотя и не в вопросе) . Используйте >. Это тонкая оболочка для mz .

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

Я использовал fs-extra , потому что это простое улучшение супер-набора fs .

Используйте npm список содержимого. Он читает содержимое и под-содержимое данного каталога и возвращает список путей к файлам и папкам.

Ответ выше не выполняет рекурсивный поиск в каталоге. Вот что я сделал для рекурсивного поиска (с помощью прогулки по узлам: npm install walk )

Это сработает и сохранит результат в файле test.txt, который будет находиться в том же каталоге

Если кто-то все еще ищет это, я делаю это:

И его работа очень хорошо для меня

Получить файлы во всех подкаталогах

Если вам нужен объект со структурой каталогов , я настоятельно рекомендую вам проверить дерево каталогов.

Допустим, у вас есть такая структура:

В противном случае, если вы хотите создать объект дерева каталогов с вашими пользовательскими настройками , посмотрите следующий фрагмент. Живой пример виден на этом codeandbox.

Тогда вы можете просто сделать:

Я сделал модуль узла для автоматизации этой задачи: mddir

Узел mddir "../relative/path/"

Для установки: npm установить mddir -g

Чтобы сгенерировать уценку для текущего каталога: mddir

Для генерации для любого абсолютного пути: mkdir / absolute / path

Чтобы сгенерировать относительный путь: mddir

MD-файл генерируется в вашем рабочем каталоге.

В настоящее время игнорирует node_modules и папки .git.

Получить путь к папке npm bin с помощью:

npm config get prefix

Компакт-диск в эту папку

Заварить установить dos2unix

Dos2unix lib / node_modules / mddir / src / mddir.js

Это преобразует окончания строк в Unix вместо Dos

Затем запустите как обычно с: node mddir "../relative/path/".

Пример сгенерированной структуры файла уценки 'directoryList.md'

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

Взял общий подход @ Hunan-Rostomyan, сделал его немного более кратким и добавил excludeDirs аргумент. Расширить с помощью includeDirs было бы тривиально, просто следуйте той же схеме:

Начиная с узла 10.10.0, можно использовать новую опцию withFileTypes для fs.readdir и fs.readdirSync в сочетании с функцией dirent.isDirectory() для фильтрации имен файлов в каталоге. Это выглядит так:

Возвращенный массив имеет вид:

Обратите внимание, что fileList слишком оптимистичен. Для чего-то серьезного, добавьте обработку ошибок.

Чтение файлов async :

Чтение файлов sync :

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

Если вы хотите просто массив путей к файлам, используйте return_object: false :

Вот простое решение, использующее только собственные модули fs и path :

Или асинхронная версия (вместо нее используется fs.readdir ):

Тогда вы просто звоните (для синхронизации версии):

Или асинхронная версия:

Разница в том, как блокирует узлы при выполнении ввода-вывода. Учитывая, что API выше, то же самое, вы можете просто использовать асинхронную версию, чтобы обеспечить максимальную производительность.

Однако есть одно преимущество использования синхронной версии. Некоторый код легче выполнить, как только завершится обход, как в следующем операторе после обхода. В асинхронной версии вам понадобится дополнительный способ узнать, когда вы закончите. Возможно, сначала создайте карту всех путей, а затем перечислите их. Для простых сценариев сборки / утилит (против высокопроизводительных веб-серверов) вы можете использовать синхронизирующую версию без какого-либо ущерба.

Просто наперед: если вы планируете выполнять операции с каждым файлом в каталоге, попробуйте vinyl-fs (который используется gulp, системой потоковой сборки).

Получить sorted имен файлов. Вы можете фильтровать результаты по определенным extension , таким как '.txt' , '.jpg' и так далее.

По мотивам предыдущей темы, решил сделать это на html, используя jPlayer. Проблема вот в чем: для преера вручную создавать список файлов тот еще геморрой, нужно это сделать автоматом при загрузке страницы. Как чекнуть файлы в определенной папке с помощью яваскрипта?


Ты хочешь javascriptом, выполняемым на стороне клиента, чекать файлы в определенной директории на сервере, я правильно понял?


Да. Это невозможно? Ну в принципе можно и php подключить, просто думал что на яваскрипте такое возможно.

А как ты себе это представляешь, если код исполняется клиентом?

Ну в принципе можно и php подключить, просто думал что на яваскрипте такое возможно.

Серверным если только.


kravich ★★★★ ( 26.07.14 12:37:14 )
Последнее исправление: kravich 26.07.14 12:38:35 (всего исправлений: 2)



Кстати, если можно изменить шаблон, используемый вэб-сервером для генерации таких страниц, то тогда можно сделать шаблон, который будет отдавать JSON.
А вообще ТСу заняться нечем похоже.

А WebDAV, наверное, можно заюзать через какую-нибудь js библиотеку.

Легче заюзать простейший скрипт на чем угодно на серверной стороне.


Получай скриптом на сервере и отдавай жсоном. Не будешь же индексы давать.


Как чекнуть файлы в определенной папке с помощью яваскрипта?

Возможно, WebDAV как один из вариантов?

наркоманы на лоре


Как чекнуть файлы в определенной папке с помощью яваскрипта?

В частном случае - зависит от сервера: либо открываешь индексы в апаче (хотя, как тебе тут объяснили, это ССЗБ), либо, если ты на амазоне хостишься, используешь для получения списка файлов AWS API, либо ещё какой изврат.

В общем случае - никак (если хостинг статический), но если серверсайд есть, пилишь серверный скрипт, который возвращает список файлов в json.

Многие приложения каким-то образом обрабатывают файлы, и манипулирование файлами является одним из основных знаний на любом языке программирования.

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

Для простоты все примеры будут написаны для следующего дерева файлов:

Файл.список()

Самым простым методом для перечисления имен файлов и папок в заданном каталоге без обхода подкаталогов является вспомогательный метод .list () , который возвращает массив String s.

Мы делаем это с помощью метода .list() в экземпляре Файла :

Используя простой цикл для каждого , мы перебираем массив и выводим Строку s.

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

Фильтр имен файлов

Запуск этого фрагмента кода приведет к:

Файл.listFiles()

Подобно предыдущему методу, этот метод можно использовать для возврата имен файлов и каталогов, но на этот раз мы получаем их в виде массива объектов File , что дает нам возможность напрямую манипулировать ими:

Теперь давайте углубимся в файловую систему, используя рекурсию и еще несколько методов для использования с Файлом объектом:

Файлы.прогулка()

В Java 8 и более поздних версиях мы можем использовать файл java.nio.Файлы класс для заполнения потока и использования его для просмотра файлов и каталогов и в то же время рекурсивного обхода всех подкаталогов.

Обратите внимание, что в этом примере мы будем использовать лямбда-выражения:

Git Essentials

Ознакомьтесь с этим практическим руководством по изучению Git, содержащим лучшие практики и принятые в отрасли стандарты. Прекратите гуглить команды Git и на самом деле изучите это!

Здесь мы заполнили Поток , используя метод .walk () , передав аргумент Пути|/. Класс Пути состоит из статических методов , которые возвращают Путь на основе строкового URI - и, используя Путь , мы можем легко найти файл.

Путь , Пути , Файлы и многие другие классы принадлежат пакету java.nio , который был представлен в Java 7 как более современный способ представления файлов неблокирующим способом.

Затем с помощью Collections Framework создается список.

Запуск этого фрагмента кода приведет к:

Вывод

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

В этой статье мы показали несколько различных способов в Java перечисления файлов в файловой системе, используя как линейный, так и рекурсивный подходы.

Читайте также: