Node.js를 사용하여 디렉토리에 있는 모든 파일의 이름 목록을 얻으려고 합니다. 파일 이름의 배열인 출력을 원합니다. 어떻게 해야 하나요?
질문자 :resopollution
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
fs
및 path
모듈만 사용하는 간단한 솔루션입니다.
// 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.readdir
및 fs.readdirSync
에 대한 withFileTypes
옵션을 사용할 수 있습니다. 다음과 같습니다.
fs.readdirSync('./dirpath', {withFileTypes: true}) .filter(item => !item.isDirectory()) .map(item => item.name)
반환된 배열은 다음과 같은 형식입니다.
['file1.txt', 'file2.txt', 'file3.txt']
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
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
'etc. > StackOverFlow' 카테고리의 다른 글
생성자와 ngOnInit의 차이점 (0) | 2023.04.20 |
---|---|
필드와 속성의 차이점은 무엇입니까? (0) | 2023.04.20 |
모든 방법을 통해 UTF-8 (0) | 2023.04.20 |
CSS 클래스 이름/선택기에서 유효한 문자는 무엇입니까? (0) | 2023.04.20 |
performSelector는 선택자를 알 수 없기 때문에 누수를 일으킬 수 있습니다. (0) | 2023.04.20 |