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

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'))


답변

다음은 기본 모듈 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가 같으면 비동기 버전을 사용하여 최대 성능을 보장 할 수 있습니다.

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


답변

노드 v10.10.0의, 새로운 사용할 수 있습니다 withFileTypes에 대한 옵션 fs.readdirfs.readdirSync과 함께 dirent.isDirectory()디렉토리에있는 파일 이름을 필터링하는 기능. 이것은 다음과 같습니다

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

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

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

fs.Dirent 클래스 용 문서


답변

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));