etc./StackOverFlow

Node.js의 디렉토리에 있는 모든 파일의 이름 목록을 어떻게 얻습니까?

청렴결백한 만능 재주꾼 2023. 4. 20. 02:24
반응형

질문자 :resopollution


Node.js를 사용하여 디렉토리에 있는 모든 파일의 이름 목록을 얻으려고 합니다. 파일 이름의 배열인 출력을 원합니다. 어떻게 해야 하나요?



fs.readdir 또는 fs.readdirSync 메서드를 사용할 수 있습니다. fs 는 Node.js 코어에 포함되어 있으므로 아무것도 설치할 필요가 없습니다.

fs.readdir

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

fs.readdirSync

 const testFolder = './tests/'; const fs = require('fs'); fs.readdirSync(testFolder).forEach(file => { console.log(file); });

두 메서드의 차이점은 첫 번째 메서드는 비동기식이므로 읽기 프로세스가 종료될 때 실행될 콜백 함수를 제공해야 한다는 것입니다.

두 번째는 동기식이며 파일 이름 배열을 반환하지만 읽기 프로세스가 끝날 때까지 코드 실행을 더 이상 중지합니다.


Christian C. Salvadó

IMO는 이러한 작업을 수행하는 가장 편리한 방법은 glob 도구를 사용하는 것입니다. 다음은 node.js용 glob 패키지입니다. 다음으로 설치

 npm install glob

그런 다음 와일드카드를 사용하여 파일 이름을 일치시킵니다(패키지의 웹사이트 에서 가져온 예).

 var glob = require("glob") // options is optional glob("**/*.js", options, function (er, files) { // files is an array of filenames. // If the `nonull` option is set, and nothing // was found, then files is ["**/*.js"] // er is an error object or null. })

globby 를 사용할 계획이라면 현재 폴더 아래에 있는 xml 파일을 찾는 예제입니다.

 import globby = require('globby'); const paths = await globby("**/*.xml");

KFL

위의 답변은 디렉토리에 대한 재귀 검색을 수행하지 않습니다. 다음은 재귀 검색을 위해 수행한 작업입니다( node-walk 사용 : npm install walk ).

 var walk = require('walk'); var files = []; // Walker options var walker = walk.walk('./test', { followLinks: false }); walker.on('file', function(root, stat, next) { // Add this file to the list of files files.push(root + '/' + stat.name); next(); }); walker.on('end', function() { console.log(files); });

Ruben Tan

모든 하위 디렉토리에서 파일 가져오기

 const fs=require('fs'); function getFiles (dir, files_){ files_ = files_ || []; var files = fs.readdirSync(dir); for (var i in files){ var name = dir + '/' + files[i]; if (fs.statSync(name).isDirectory()){ getFiles(name, files_); } else { files_.push(name); } } return files_; } console.log(getFiles('path/to/dir'))

Tito100

fspath 모듈만 사용하는 간단한 솔루션입니다.

 // sync version function walkSync(currentDirPath, callback) { var fs = require('fs'), path = require('path'); fs.readdirSync(currentDirPath).forEach(function (name) { var filePath = path.join(currentDirPath, name); var stat = fs.statSync(filePath); if (stat.isFile()) { callback(filePath, stat); } else if (stat.isDirectory()) { walkSync(filePath, callback); } }); }

또는 비동기 버전( fs.readdir 사용):

 // async version with basic error handling function walk(currentDirPath, callback) { var fs = require('fs'), path = require('path'); fs.readdir(currentDirPath, function (err, files) { if (err) { throw new Error(err); } files.forEach(function (name) { var filePath = path.join(currentDirPath, name); var stat = fs.statSync(filePath); if (stat.isFile()) { callback(filePath, stat); } else if (stat.isDirectory()) { walk(filePath, callback); } }); }); }

그런 다음 (동기화 버전의 경우) 다음을 호출합니다.

 walkSync('path/to/root/dir', function(filePath, stat) { // do something with "filePath"... });

또는 비동기 버전:

 walk('path/to/root/dir', function(filePath, stat) { // do something with "filePath"... });

차이점은 IO를 수행하는 동안 노드가 차단되는 방식입니다. 위의 API가 동일하므로 비동기 버전을 사용하여 최대 성능을 보장할 수 있습니다.

그러나 동기 버전을 사용하면 한 가지 이점이 있습니다. 걷기 후 다음 명령문에서와 같이 걷기가 완료되자마자 일부 코드를 실행하는 것이 더 쉽습니다. 비동기 버전을 사용하면 완료 시점을 알 수 있는 몇 가지 추가 방법이 필요합니다. 아마도 모든 경로의 맵을 먼저 생성한 다음 열거할 수 있습니다. 간단한 빌드/유틸 스크립트(고성능 웹 서버 대비)의 경우 손상 없이 동기화 버전을 사용할 수 있습니다.


Ali

Node v10.10.0부터 디렉토리의 파일 이름을 필터링하기 위해 dirent.isDirectory() 함수와 함께 fs.readdirfs.readdirSync 에 대한 withFileTypes 옵션을 사용할 수 있습니다. 다음과 같습니다.

 fs.readdirSync('./dirpath', {withFileTypes: true}) .filter(item => !item.isDirectory()) .map(item => item.name)

반환된 배열은 다음과 같은 형식입니다.

 ['file1.txt', 'file2.txt', 'file3.txt']

fs.Dirent 클래스용 문서


bnp887

ES7에서 프라미스 사용하기

mz/fs와 비동기식 사용

mz 모듈은 핵심 노드 라이브러리의 약속된 버전을 제공합니다. 그것들을 사용하는 것은 간단합니다. 먼저 라이브러리를 설치하고...

 npm install mz

그 다음에...

 const fs = require('mz/fs'); fs.readdir('./myDir').then(listing => console.log(listing)) .catch(err => console.error(err));

또는 ES7의 비동기 함수로 작성할 수 있습니다.

 async function myReaddir () { try { const file = await fs.readdir('./myDir/'); } catch (err) { console.error( err ) } };

재귀 목록 업데이트

일부 사용자는 재귀 목록을 보고 싶어한다고 지정했습니다(질문에는 없지만)... fs-promise 사용하십시오. mz 주위의 얇은 래퍼입니다.

 npm install fs-promise;

그 다음에...

 const fs = require('fs-promise'); fs.walk('./myDir').then( listing => listing.forEach(file => console.log(file.path)) ).catch(err => console.error(err));

Evan Carroll

비재귀 버전

재귀 적으로 수행하고 싶다고 말하지 않으므로 디렉토리의 직계 자식 만 필요하다고 가정합니다.

샘플 코드:

 const fs = require('fs'); const path = require('path'); fs.readdirSync('your-directory-path') .filter((file) => fs.lstatSync(path.join(folder, file)).isFile());

Tyler Long

종속성.

 var fs = require('fs'); var path = require('path');

정의.

 // String -> [String] function fileList(dir) { return fs.readdirSync(dir).reduce(function(list, file) { var name = path.join(dir, file); var isDir = fs.statSync(name).isDirectory(); return list.concat(isDir ? fileList(name) : [name]); }, []); }

용법.

 var DIR = '/usr/local/bin'; // 1. List all files in DIR fileList(DIR); // => ['/usr/local/bin/babel', '/usr/local/bin/bower', ...] // 2. List all file names in DIR fileList(DIR).map((file) => file.split(path.sep).slice(-1)[0]); // => ['babel', 'bower', ...]

fileList 는 너무 낙관적입니다. 심각한 경우 오류 처리를 추가하십시오.


Hunan Rostomyan

귀하의 질문에서 디렉토리 이름이 아닌 파일 만 원한다고 가정하고 있습니다.

디렉토리 구조 예

 animals ├── all.jpg ├── mammals │ └── cat.jpg │ └── dog.jpg └── insects └── bee.jpg

Walk 기능

크레딧은 이 요지 에서 Justin Maier 에게 돌아갑니다.

파일 경로 의 배열만 원하면 return_object: false .

 const fs = require('fs').promises; const path = require('path'); async function walk(dir) { let files = await fs.readdir(dir); files = await Promise.all(files.map(async file => { const filePath = path.join(dir, file); const stats = await fs.stat(filePath); if (stats.isDirectory()) return walk(filePath); else if(stats.isFile()) return filePath; })); return files.reduce((all, folderContents) => all.concat(folderContents), []); }

용법

 async function main() { console.log(await walk('animals')) }

산출

 [ "/animals/all.jpg", "/animals/mammals/cat.jpg", "/animals/mammals/dog.jpg", "/animals/insects/bee.jpg" ];

a.barbieri

누군가가 여전히 이것을 검색한다면, 나는 이것을 한다:

 import fs from 'fs'; import path from 'path'; const getAllFiles = dir => fs.readdirSync(dir).reduce((files, file) => { const name = path.join(dir, file); const isDirectory = fs.statSync(name).isDirectory(); return isDirectory ? [...files, ...getAllFiles(name)] : [...files, name]; }, []);

그리고 그 일은 나에게 아주 좋다.


Josh

로드 fs :

 const fs = require('fs');

비동기식 파일 읽기:

 fs.readdir('./dir', function (err, files) { // "files" is an Array with files names });

파일 동기화 읽기:

 var files = fs.readdirSync('./dir');

Eduardo Cuomo

sorted 파일 이름을 가져옵니다. '.txt' , '.jpg' 등과 같은 extension 기반으로 결과를 필터링할 수 있습니다.

 import * as fs from 'fs'; import * as Path from 'path'; function getFilenames(path, extension) { return fs .readdirSync(path) .filter( item => fs.statSync(Path.join(path, item)).isFile() && (extension === undefined || Path.extname(item) === extension) ) .sort(); }

Yas

이것은 선택적으로 재귀적이며 선택적으로 오류 로깅 및 비동기 솔루션인 TypeScript입니다. 찾으려는 파일 이름에 대해 정규식을 지정할 수 있습니다.

내가 사용 fs-extra 에 그것의 쉬운 슈퍼 세트 개선으로 인해 fs .

 import * as FsExtra from 'fs-extra' /** * Finds files in the folder that match filePattern, optionally passing back errors . * If folderDepth isn't specified, only the first level is searched. Otherwise anything up * to Infinity is supported. * * @static * @param {string} folder The folder to start in. * @param {string} [filePattern='.*'] A regular expression of the files you want to find. * @param {(Error[] | undefined)} [errors=undefined] * @param {number} [folderDepth=0] * @returns {Promise<string[]>} * @memberof FileHelper */ public static async findFiles( folder: string, filePattern: string = '.*', errors: Error[] | undefined = undefined, folderDepth: number = 0 ): Promise<string[]> { const results: string[] = [] // Get all files from the folder let items = await FsExtra.readdir(folder).catch(error => { if (errors) { errors.push(error) // Save errors if we wish (eg folder perms issues) } return results }) // Go through to the required depth and no further folderDepth = folderDepth - 1 // Loop through the results, possibly recurse for (const item of items) { try { const fullPath = Path.join(folder, item) if ( FsExtra.statSync(fullPath).isDirectory() && folderDepth > -1) ) { // Its a folder, recursively get the child folders' files results.push( ...(await FileHelper.findFiles(fullPath, filePattern, errors, folderDepth)) ) } else { // Filter by the file name pattern, if there is one if (filePattern === '.*' || item.search(new RegExp(filePattern, 'i')) > -1) { results.push(fullPath) } } } catch (error) { if (errors) { errors.push(error) // Save errors if we wish } } } return results }

Paul F. Wood

상자 밖으로

기본적으로 디렉토리 구조를 가진 객체 를 원할 경우 directory-tree 를 확인하는 것이 좋습니다.

다음과 같은 구조가 있다고 가정해 보겠습니다.

 photos │ june │ └── windsurf.jpg └── january ├── ski.png └── snowboard.jpg
 const dirTree = require("directory-tree"); const tree = dirTree("/path/to/photos");

반환됩니다:

 { path: "photos", name: "photos", size: 600, type: "directory", children: [ { path: "photos/june", name: "june", size: 400, type: "directory", children: [ { path: "photos/june/windsurf.jpg", name: "windsurf.jpg", size: 400, type: "file", extension: ".jpg" } ] }, { path: "photos/january", name: "january", size: 200, type: "directory", children: [ { path: "photos/january/ski.png", name: "ski.png", size: 100, type: "file", extension: ".png" }, { path: "photos/january/snowboard.jpg", name: "snowboard.jpg", size: 100, type: "file", extension: ".jpg" } ] } ] }

사용자 정의 개체

그렇지 않고 사용자 정의 설정으로 디렉토리 트리 객체 를 생성하려면 다음 스니펫을 살펴보십시오. 실제 예제는 이 코드샌드박스에서 볼 수 있습니다.

 // my-script.js const fs = require("fs"); const path = require("path"); const isDirectory = filePath => fs.statSync(filePath).isDirectory(); const isFile = filePath => fs.statSync(filePath).isFile(); const getDirectoryDetails = filePath => { const dirs = fs.readdirSync(filePath); return { dirs: dirs.filter(name => isDirectory(path.join(filePath, name))), files: dirs.filter(name => isFile(path.join(filePath, name))) }; }; const getFilesRecursively = (parentPath, currentFolder) => { const currentFolderPath = path.join(parentPath, currentFolder); let currentDirectoryDetails = getDirectoryDetails(currentFolderPath); const final = { current_dir: currentFolder, dirs: currentDirectoryDetails.dirs.map(dir => getFilesRecursively(currentFolderPath, dir) ), files: currentDirectoryDetails.files }; return final; }; const getAllFiles = relativePath => { const fullPath = path.join(__dirname, relativePath); const parentDirectoryPath = path.dirname(fullPath); const leafDirectory = path.basename(fullPath); const allFiles = getFilesRecursively(parentDirectoryPath, leafDirectory); return allFiles; }; module.exports = { getAllFiles };

그런 다음 간단히 다음을 수행할 수 있습니다.

 // another-file.js const { getAllFiles } = require("path/to/my-script"); const allFiles = getAllFiles("/path/to/my-directory");

Mahesh

다음은 비동기 재귀 버전입니다.

 function ( path, callback){ // the callback gets ( err, files) where files is an array of file names if( typeof callback !== 'function' ) return var result = [] , files = [ path.replace( /\/\s*$/, '' ) ] function traverseFiles (){ if( files.length ) { var name = files.shift() fs.stat(name, function( err, stats){ if( err ){ if( err.errno == 34 ) traverseFiles() // in case there's broken symbolic links or a bad path // skip file instead of sending error else callback(err) } else if ( stats.isDirectory() ) fs.readdir( name, function( err, files2 ){ if( err ) callback(err) else { files = files2 .map( function( file ){ return name + '/' + file } ) .concat( files ) traverseFiles() } }) else{ result.push(name) traverseFiles() } }) } else callback( null, result ) } traverseFiles() }

Oggy Transfluxitor Jones

@Hunan-Rostomyan의 일반적인 접근 방식을 취하여 좀 더 간결하게 만들고 excludeDirs 인수를 추가했습니다. includeDirs 로 확장하는 것은 간단하며 동일한 패턴을 따르십시오.

 import * as fs from 'fs'; import * as path from 'path'; function fileList(dir, excludeDirs?) { return fs.readdirSync(dir).reduce(function (list, file) { const name = path.join(dir, file); if (fs.statSync(name).isDirectory()) { if (excludeDirs && excludeDirs.length) { excludeDirs = excludeDirs.map(d => path.normalize(d)); const idx = name.indexOf(path.sep); const directory = name.slice(0, idx === -1 ? name.length : idx); if (excludeDirs.indexOf(directory) !== -1) return list; } return list.concat(fileList(name, excludeDirs)); } return list.concat([name]); }, []); }

사용 예:

 console.log(fileList('.', ['node_modules', 'typings', 'bower_components']));

A T

누군가가 다음과 같은 경우 내 2센트:

프로젝트의 로컬 하위 폴더에서 파일 이름(디렉토리 제외)을 나열하고 싶을 뿐입니다.

  • ✅ 추가 종속성 없음
  • ✅ 1개의 기능
  • ✅ 경로 정규화(Unix vs. Windows)
 const fs = require("fs"); const path = require("path"); /** * @param {string} relativeName "resources/foo/goo" * @return {string[]} */ const listFileNames = (relativeName) => { try { const folderPath = path.join(process.cwd(), ...relativeName.split("/")); return fs .readdirSync(folderPath, { withFileTypes: true }) .filter((dirent) => dirent.isFile()) .map((dirent) => dirent.name.split(".")[0]); } catch (err) { // ... } };
 README.md package.json resources |-- countries |-- usa.yaml |-- japan.yaml |-- gb.yaml |-- provinces |-- ......... listFileNames("resources/countries") #=> ["usa", "japan", "gb"]

Manu

주의 사항: 디렉터리의 각 파일에 대해 작업을 수행하려는 경우 vinyl-fs (스트리밍 빌드 시스템인 gulp 에서 사용됨)를 시도하십시오.


XåpplI'-I0llwlg'I -

이것은 작동하고 동일한 디렉토리에 있는 test.txt 파일에 결과를 저장합니다.

 fs.readdirSync(__dirname).forEach(file => { fs.appendFileSync("test.txt", file+"\n", function(err){ }) })

Rama

저는 최근에 이 작업을 수행하는 도구를 만들었습니다... 이 도구는 디렉터리를 비동기적으로 가져오고 항목 목록을 반환합니다. 폴더를 먼저 사용하여 디렉토리, 파일 또는 둘 다를 가져올 수 있습니다. 전체 폴더를 가져오지 않으려는 경우 데이터에 페이지를 매길 수도 있습니다.

https://www.npmjs.com/package/fs-browser

이것은 링크입니다. 누군가에게 도움이 되길 바랍니다!


stefantigro

나는 보통 사용합니다: FS-Extra .

 const fileNameArray = Fse.readdir('/some/path');

결과:

 [ "b7c8a93c-45b3-4de8-b9b5-a0bf28fb986e.jpg", "daeb1c5b-809f-4434-8fd9-410140789933.jpg" ]

LondonGuy

이 작업을 자동화하기 위해 노드 모듈을 만들었습니다. mddir

용법

노드 mddir "../상대/경로/"

설치하려면: npm install mddir -g

현재 디렉토리에 대한 마크다운을 생성하려면: mddir

모든 절대 경로에 대해 생성하려면: mddir /absolute/path

상대 경로 생성: mddir ~/Documents/whatever.

md 파일은 작업 디렉토리에 생성됩니다.

현재 node_modules 및 .git 폴더를 무시합니다.

문제 해결

'노드\r: 해당 파일 또는 디렉터리가 없습니다' 오류가 표시되면 운영 체제가 다른 줄 끝을 사용하고 mddir이 줄 끝 스타일을 Unix로 명시적으로 설정하지 않고는 구문 분석할 수 없다는 것이 문제입니다. 이것은 일반적으로 Windows에 영향을 미치지만 일부 Linux 버전에도 영향을 미칩니다. 줄 끝을 Unix 스타일로 설정하려면 mddir npm 전역 bin 폴더 내에서 수행해야 합니다.

줄 끝 수정

다음을 사용하여 npm bin 폴더 경로를 가져옵니다.

npm config get prefix

해당 폴더에 cd

양조 설치 dos2unix

dos2unix lib/node_modules/mddir/src/mddir.js

이것은 줄 끝을 Dos 대신 Unix로 변환합니다.

그런 다음 node mddir "../relative/path/"를 사용하여 정상적으로 실행합니다.

생성된 마크다운 파일 구조 'directoryList.md'의 예

 |-- .bowerrc |-- .jshintrc |-- .jshintrc2 |-- Gruntfile.js |-- README.md |-- bower.json |-- karma.conf.js |-- package.json |-- app |-- app.js |-- db.js |-- directoryList.md |-- index.html |-- mddir.js |-- routing.js |-- server.js |-- _api |-- api.groups.js |-- api.posts.js |-- api.users.js |-- api.widgets.js |-- _components |-- directives |-- directives.module.js |-- vendor |-- directive.draganddrop.js |-- helpers |-- helpers.module.js |-- proprietary |-- factory.actionDispatcher.js |-- services |-- services.cardTemplates.js |-- services.cards.js |-- services.groups.js |-- services.posts.js |-- services.users.js |-- services.widgets.js |-- _mocks |-- mocks.groups.js |-- mocks.posts.js |-- mocks.users.js |-- mocks.widgets.js

John Byrne

npm list-contents 모듈을 사용합니다. 주어진 디렉토리의 내용과 하위 내용을 읽고 파일 및 폴더의 경로 목록을 반환합니다.

 const list = require('list-contents'); list("./dist",(o)=>{ if(o.error) throw o.error; console.log('Folders: ', o.dirs); console.log('Files: ', o.files); });

Paweł

위의 많은 옵션이 너무 복잡해 보이거나 여기에서 찾고 있는 것이 아닌 경우 node-dir - https://github.com/fshost/node-dir을 사용하는 또 다른 접근 방식이 있습니다.

 npm install node-dir

다음은 하위 디렉토리에서 검색하는 모든 .xml 파일을 나열하는 간단한 기능입니다.

 import * as nDir from 'node-dir' ; listXMLs(rootFolderPath) { let xmlFiles ; nDir.files(rootFolderPath, function(err, items) { xmlFiles = items.filter(i => { return path.extname(i) === '.xml' ; }) ; console.log(xmlFiles) ; }); }

Mauricio Gracia Gutierrez

function getFilesRecursiveSync(dir, fileList, optionalFilterFunction) { if (!fileList) { grunt.log.error("Variable 'fileList' is undefined or NULL."); return; } var files = fs.readdirSync(dir); for (var i in files) { if (!files.hasOwnProperty(i)) continue; var name = dir + '/' + files[i]; if (fs.statSync(name).isDirectory()) { getFilesRecursiveSync(name, fileList, optionalFilterFunction); } else { if (optionalFilterFunction && optionalFilterFunction(name) !== true) continue; fileList.push(name); } } }

Francois

출처 : http:www.stackoverflow.com/questions/2727167/how-do-you-get-a-list-of-the-names-of-all-files-present-in-a-directory-in-node-j

반응형