Node.js를 사용하여 디렉토리에있는 모든 파일의 이름 목록을 얻으려고합니다. 파일 이름의 배열 인 출력을 원합니다. 어떻게해야합니까?
답변
fs.readdir
또는 fs.readdirSync
방법을 사용할 수 있습니다 .
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);
});
두 메소드의 차이점은 첫 번째 메소드는 비동기 적이므로 읽기 프로세스가 종료 될 때 실행될 콜백 함수를 제공해야한다는 것입니다.
두 번째는 동기식이며 파일 이름 배열을 반환하지만 읽기 프로세스가 끝날 때까지 코드의 추가 실행을 중지합니다.
답변
이러한 작업을 수행하기 위해 IMO 가장 convinient 방법은 사용하는 것입니다 글로브의 도구를. 다음 은 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.
})
답변
위의 대답은 디렉토리에 대한 재귀 검색을 수행하지 않습니다. 여기에 내가 재귀 검색에 무슨 짓을했는지 (사용 노드 산책 : 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);
});
답변
모든 하위 디렉토리에서 파일 가져 오기
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'))
답변
다음은 기본 모듈 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가 같으면 비동기 버전을 사용하여 최대 성능을 보장 할 수 있습니다.
그러나 동기식 버전을 사용하면 한 가지 이점이 있습니다. 보행 후 다음 명령문에서와 같이 보행이 완료 되 자마자 일부 코드를 실행하는 것이 더 쉽습니다. 비동기 버전을 사용하면 완료 시점을 알 수있는 추가 방법이 필요합니다. 아마도 모든 경로의 맵을 먼저 만든 다음 열거합니다. 간단한 빌드 / 유틸리티 스크립트 (고성능 웹 서버)의 경우 동기화 버전을 손상없이 사용할 수 있습니다.
답변
노드 v10.10.0의, 새로운 사용할 수 있습니다 withFileTypes
에 대한 옵션 fs.readdir
과 fs.readdirSync
과 함께 dirent.isDirectory()
디렉토리에있는 파일 이름을 필터링하는 기능. 이것은 다음과 같습니다
fs.readdirSync('./dirpath', {withFileTypes: true})
.filter(item => !item.isDirectory())
.map(item => item.name)
반환 된 배열은 다음과 같은 형식입니다.
['file1.txt', 'file2.txt', 'file3.txt']
답변
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));