Nodejs에서 모듈 fs 파일 시스템을 사용하는 방법

4544 단어 nodejsfs파일

개요


fde의 fs 문서는 촘촘한api가 매우 많은데 파일 시스템에 대한 조작을 전면적으로 지원하기 때문이다.문서가 잘 구성되어 있고 조작은 기본적으로 파일 조작, 디렉터리 조작, 파일 정보, 흐름이라는 큰 부분으로 나뉘며 프로그래밍 방식도 동기화, 비동기화와 Promise를 지원한다.
본고는 몇 개의 문서에서 상세하게 묘사되지 않은 문제를 기록하여 fs 문서의 사고방식을 더욱 잘 연결할 수 있다.
  • 파일 설명자
  • 동기화, 비동기화 및 Promise
  • 디렉터리와 디렉터리 항목
  • 파일 정보
  • stream
  • 파일 설명자


    파일 설명자는 음수가 아닌 정수입니다.이것은 색인 값으로 운영체제가 그것에 따라 대응하는 파일을 찾을 수 있다.
    fs의 많은 밑바닥api에서 파일 설명자를 사용해야 합니다.문서에서 설명 문자는 항상 fd로 대표됩니다.예: fs.read(fd, buffer, offset, length, position, callback).이api와 대응하는 것은: fs.readFile(path[, options], callback).
    운영체제가 파일 설명자의 수량에 제한이 있기 때문에 파일 작업이 끝난 후close를 잊지 마십시오:
    
    const fs = require("fs");
    
    fs.open("./db.json", "r", (err, fd) => {
        if (err) throw err;
        //  ...
        //  , 
        fs.close(fd, err => {
            if (err) throw err;
        });
    });

    동기식, 비동기식 및 Promise


    모든 파일 시스템의api는 동기화와 비동기화 두 가지 형식이 있습니다.

    동기식


    동기화api를 사용하는 것을 추천하지 않습니다. 라인이 막힙니다.
    
    try {
        const buf = fs.readFileSync("./package.json");
        console.log(buf.toString("utf8"));
    } catch (error) {
        console.log(error.message);
    }

    비동기식


    비동기식으로 쓰면 회조 지옥에 들어가기 쉽다.
    
    fs.readFile("./package.json", (err, data) => {
        if (err) throw err;
        console.log(data.toString("utf8"));
    });

    (추천) Promise 쓰기


    node v12 이전에 promise 패키지를 사용해야 합니다.
    
    function readFilePromise(path, encoding = "utf8") {
        const promise = new Promise((resolve, reject) => {
            fs.readFile(path, (err, data) => {
                if (err) return reject(err);
                return resolve(data.toString(encoding));
            });
        });
        return promise;
    }
    
    readFilePromise("./package.json").then(res => console.log(res));
    node v12에서 fs Promiseapi를 도입했습니다.리셋 대신 Promise 객체를 반환합니다.API는 require('fs')를 통해 사용할 수 있습니다.promises 접근.이렇게 되면 개발 원가가 더욱 낮아진다.
    
    const fsPromises = require("fs").promises;
    
    fsPromises
        .readFile("./package.json", {
            encoding: "utf8",
            flag: "r"
        })
        .then(console.log)
        .catch(console.error);

    디렉터리와 디렉터리 항목


    fs.Dir 클래스: 파일 디렉토리와 관련된 작업을 패키지화합니다.
    fs.Dirent 클래스: 디렉터리 항목에 대한 작업이 봉인되었습니다.예를 들어 장치 유형(문자, 블록, FIFO 등)을 판단합니다.
    코드를 통해 이러한 관계를 보여줍니다.
    
    const fsPromises = require("fs").promises;
    
    async function main() {
        const dir = await fsPromises.opendir(".");
        let dirent = null;
        while ((dirent = await dir.read()) !== null) {
            console.log(dirent.name);
        }
    }
    
    main();

    파일 정보


    fs.Stats 클래스: 파일 정보와 관련된 작업을 봉인했습니다.그것은 fs에 있다.stat () 의 콜백 함수에서 반환됩니다.
    
    fs.stat("./package.json", (err, stats) => {
        if (err) throw err;
        console.log(stats);
    });
    파일이 있는지 확인하는 방법:
  • fs를 호출하는 것을 권장하지 않습니다.open()、 fs.readFile () 또는 fs.writeFile () 을 사용하기 전에 fs.stat () 파일이 있는지 확인합니다.파일을 직접 열거나 읽거나 써야 합니다. 파일을 사용할 수 없으면 오류가 발생합니다..
  • 파일이 존재하는지 확인하고 조작하지 않으려면 fs를 사용하는 것을 권장합니다.access()
  • ReadStream 및 WriteStream


    nodejs에서stream은 매우 중요한 라이브러리입니다.많은 라이브러리의api는stream을 기반으로 봉인되어 있습니다.예를 들어, 다음 fs의 ReadStream 및 WriteStream 을 참조하십시오.
    fs 자체는readFile과writeFile를 제공합니다. 그 대가는 성능에 문제가 있어서 내용을 한 번에 모두 메모리에 불러오는 것입니다.그러나 몇 GB의 큰 파일에 대해서는 분명히 문제가 있을 것이다.
    그러면 큰 파일에 대한 해결 방안은 자연히 조금씩 읽는 것이다.이것은stream이 필요합니다.readStream의 경우 코드는 다음과 같습니다.
    
    const rs = fs.createReadStream("./package.json");
    let content = "";
    
    rs.on("open", () => {
        console.log("start to read");
    });
    
    rs.on("data", chunk => {
        content += chunk.toString("utf8");
    });
    
    rs.on("close", () => {
        console.log("finish read, content is:
    ", content); });
    stream의 pipe를 통해 한 줄에 큰 파일의 복사 함수를 신속하게 봉인합니다.
    
    function copyBigFile(src, target) {
        fs.createReadStream(src).pipe(fs.createWriteStream(target));
    }
    이상은 Nodejs에서 모듈 fs 파일 시스템을 어떻게 사용하는지에 대한 상세한 내용입니다. 더 많은 Nodejs에 대한 자료는 저희 다른 관련 글에 주목하세요!

    좋은 웹페이지 즐겨찾기