파일 시스템 작업

완료됨

Tailwind Traders에서는 각 매장이 파일에 매출 합계를 쓴 다음, 해당 파일을 중앙 위치에 보냅니다. 이러한 파일을 사용하려면 회사는 파일 시스템에 작동할 수 있는 일괄 처리 프로세스를 만들어야 합니다.

여기서는 Node.js를 사용하여 파일 시스템을 읽고 파일 및 디렉터리를 검색하는 방법을 알아봅니다.

fs 모듈 포함

Node.js는 파일 시스템 작업을 위한 기본 제공 모듈인 fs(파일 시스템의 경우 약식)를 제공합니다. Node.js 런타임의 일부이므로 설치할 필요가 없습니다. 다른 종속성과 마찬가지로 참조합니다.

fs 모듈에는 promises 모든 메서드의 버전이 있는 네임스페이 promise 스가 있습니다. 네임스페이 promise 스를 사용하면 콜백의 지저분함이나 동기 메서드 차단을 방지하는 데 사용할 수 있으므로 fs 모듈을 사용하는 async 것이 좋습니다.

const fs = require("fs").promises;

fs 모듈을 사용하면 파일 및 디렉터리에서 다양한 작업을 수행할 수 있습니다. 선택할 수 있는 몇 가지 방법이 있습니다. 지금은 디렉터리 작업을 위해 알아야 할 사항에 초점을 맞출 것입니다.

fs.readdir을 사용하여 디렉터리의 콘텐츠 나열

fs 모듈을 사용하여 종종 수행하는 한 가지 작업은 디렉터리 내용을 나열 또는 열거하는 것입니다. 예를 들어 Tailwind Traders에는 stores라는 루트 폴더가 있습니다. 이 폴더에는 매장 번호를 기준으로 구성된 하위 폴더가 있습니다. 이러한 폴더 안에는 매출 합계 파일이 들어 있습니다. 구조는 다음과 같습니다.

📂 stores
    📄 sales.json
    📄 totals.txt
    📂 201
    📂 202

폴더의 내용을 읽으려면 비동 readdir 기 메서드를 사용할 수 있습니다. fs 모듈의 대부분의 작업에는 동기(사후 지출Sync) 및 비동기 옵션이 모두 있습니다. 결과는 영숫자 순서로 반환됩니다.

const fs = require("fs").promises;

async function main() {
    const items = await fs.readdir("stores");
    console.log(items);
}
main();

영숫자 정렬된 항목 목록은 다음과 같습니다.

[ '201', '202', '203', '204' ]

isDirectory를 사용하여 콘텐츠 형식 확인

디렉터리 내용을 읽는 경우 폴더와 파일을 문자열 배열로 다시 가져옵니다. withFileTypes 옵션을 전달하여 어느 문자열이 파일이고 어느 문자열이 디렉터리인지 확인할 수 있습니다. 이 옵션은 문자열 배열 대신 Dirent 개체 배열을 반환합니다. Dirent 개체에는 처리 중인 개체 형식을 확인하는 데 사용할 수 있는 isFileisDirectory 메서드가 있습니다.

const fs = require("fs").promises;

async function main() {
    const items = await fs.readdir("stores", { withFileTypes: true });
    for (let item of items) {
        const type = item.isDirectory() ? "folder" : "file";
        console.log(`${item.name}: ${type}`);
    }
}
main();

영숫자 정렬된 항목 목록은 다음과 같습니다.

201: folder
202: folder
203: folder
204: folder

재귀에 대한 참고 사항

여러 개의 중첩된 폴더가 포함된 복잡한 디렉터리 구조를 사용해야 하는 경우가 많으며, 각각 더 많은 하위 폴더와 파일이 포함될 수 있습니다. 이러한 경우 이 트리와 유사한 구조를 탐색하여 특정 파일을 찾을 수 있는 방법이 필요합니다.

이를 위해 항목이 폴더인지를 식별하는 함수를 만들 수 있습니다. 이 경우 함수는 해당 폴더 내에서 더 많은 파일을 검색합니다. 이 프로세스는 찾은 모든 폴더에 대해 반복됩니다.

이는 함수가 자신을 호출하여 새로 찾은 폴더 내에서 검색하는 재귀라는 기술을 사용하여 수행됩니다. 이렇게 하면 프로그램이 전체 디렉터리 트리를 "탐색"하여 모든 폴더가 탐색될 때까지 모든 중첩된 폴더에 도달할 수 있습니다.

const fs = require("fs").promises;

async function findFiles(folderName) {

    let results = []

    results.push(`${folderName}`);

    const items = await fs.readdir(folderName, { withFileTypes: true });

    for (const item of items) {
        if (item.isDirectory()) {

            // RECURSION - calling the function from within itself
            const resultsReturned = await findFiles(`${folderName}/${item.name}`);
            results = results.concat(resultsReturned);
        } else {
            results.push(`${folderName}/${item.name}`);
        }
    }

    return results;
}

findFiles("stores").then((results) => console.log(results));

출력은 다음과 같습니다.

[
  'stores',
  'stores/201',
  'stores/201/sales.json',
  'stores/202',
  'stores/202/sales.json',
  'stores/203',
  'stores/203/sales.json',
  'stores/204',
  'stores/204/sales.json'
]

미리 정의된 개발 환경 사용

이 학습 모듈은 브라우저 또는 로컬 컴퓨터에 대한 개발 컨테이너를 제공합니다. 이 컨테이너는 필요한 모든 환경을 제공하므로 IDE 또는 Node.js를 설치하지 않고도 이 학습 모듈을 사용할 수 있습니다. 이 학습 모듈을 완료하기 위해 컨테이너에 대해 아무것도 알 필요가 없습니다.

지식 점검

1.

다음 중 fs 모듈을 사용하여 수행할 수 있는 작업은 무엇인가요?