본문 바로가기
Programing

Node.js 파일 시스템 API - 초보자를 위한 가이드

by 멍멍돌이야 2022. 6. 2.
반응형

파일 시스템 API

파일 시스템 액세스, 파일 관리 및 편집은 아마도 서버 측에서 수행되는 가장 중요한 작업 중 하나일 것입니다.

따라서 Node.js는 이러한 기능을 제공하는 것으로 간주됩니다.

이는 방대한 수의 메서드와 속성을 포함하는 FS(파일 시스템) API의 형태로 수행됩니다.

이 API의 일상적인 사용은 일반적으로 파일을 읽고 쓰는 것으로 제한되지만 아직 발견할 것이 훨씬 더 많습니다.

 

비동기 특성

파일에 대해 수행되는 작업은 시간이 걸릴 수 있습니다.

JS 단일 스레드 특성을 사용하면 FS API가 asynchronicity 합니다.

따라서 읽기 및 쓰기와 관련된 모든 메서드에는 비동기 및 동기 버전이 있습니다.

이러한 경우에는 비동기가 확실히 더 나은 솔루션이므로 적절한 -Sync 접미사가 있는 메서드의 동기화 버전입니다.

한다는 점을 명심해야 합니다 매우 권장되지 않으며 사용 시 기본 스레드가 다른 작업을 수행하지 못하도록 차단 주의해서 사용하십시오(꼭 필요한 경우에만)!

 

위에서 설명한 이유 때문에 API의 비동기 메서드에만 초점을 맞출 것입니다. 동기화 상대는 매우 유사하게 보이며(콜백 및 반환 값 제외) 더 자세히 알고 싶다면 언제든지 공식 문서를 확인할 수 있습니다.

 

독서

액세스 확인

파일을 읽는 프로세스 또는 일부에서는 파일 액세스가 모든 FS 관련 프로세스 중에서 비교적 간단합니다.

fs.access() 예시.

const fs = require("fs");

fs.access("file.js", fs.constants.F_OK, err => {
    console.log(err ? "Doesn't exist" : "Exists");
});

다른 많은 FS 방법과 마찬가지로, fs.access()를 파일 경로 첫 번째 매개변수로 사용합니다. 이 인수를 전달할 때 거의 항상 3가지 허용되는 형식 ( string , buffer URL object .

 

const pathStr = "file.js";
const pathBuff = Buffer.from("file.js");
const pathURL = new URL("file:///current/dir/file.js");

문자열 및 버퍼 형식은 상대 및 절대 경로를 모두 나타낼 수 있지만 URL 파일 사용으로 제한됩니다. 프로토콜 절대 경로만 . 경로를 나타내는 데이터 유형은 사용 사례에 따라 다르며 기본값은 문자열 형식일 가능성이 가장 높습니다. 또한 Windows와 절대 경로 및 드라이브의 문자를 처리하는 방식에 몇 가지 단점이 있습니다. 자세한 내용 은 문서 하세요.

 

라고 하는 두 번째 선택적 인수 모드 는 주어진 파일에 필요한 액세스 권한 유형을 정의하는 데 사용할 수 있습니다. 예를 들어 읽기, 쓰기 액세스 또는 파일이 존재하는지 간단한 검사가 될 수 있습니다. 정수로 표시되므로 fs.access()방법을 염두에 두고 일반적으로 다음 파일 액세스 상수 을 통해 액세스되는 fs.constants설정합니다. 이것들은 F_OK, R_OK, W_OK, 그리고 X_OK파일 가시성(존재하는 경우), 읽기 권한, 쓰기 권한 및 실행 권한을 각각 나타냅니다.

 

마지막으로, 하는 콜백 무언가 잘못되었을 때 항상 오류를 제공 따라서 오류가 발생하지 않으면 파일에 대한 올바른 액세스 권한이 있는지 확인할 수 있습니다.

 

파일 읽기

액세스 검사의 올바른 결과로 파일을 계속 읽을 . Node.js에서는 호출하는 것보다 어렵지 않습니다. fs.readFile(). 인수로 파일 및 콜백에 대한 경로를 전달해야 하며, 여기서 버퍼 형식의 파일 데이터에 액세스할 수 있습니다.

 

fs.readFile("file.js", (err, data) => {
    if (!err) {
        console.log(data); // <Buffer ...>
    }
});

그러나 버퍼 형식의 데이터는 실제로 유용하지 않습니다. 물론, 원하는 방식으로 계속 사용할 수 있고 예를 들어 나중에 구문 분석할 수 있지만 표준 utf8 인코딩 . 이를 위해 선택적 옵션 매개변수 하고 인코딩을 나타내는 문자열이나 객체를 전달할 encoding그리고 flag속성. 로 구성된 문자열이어야 합니다. 파일 시스템 플래그 ** "a"(추가), "r"(읽기, 기본값) 또는 "w"(쓰다).

 

fs.readFile("file.js", "utf8", (err, data) => {
    if (!err) {
        console.log(data); // file content
    }
});

디렉토리 읽기

사용 fs.readFile()사용 디렉토리 경로 하는 것은 플랫폼별 동작(대부분 오류 발생)으로 인해 권장되지 않습니다. 대신 각각의 fs.readdir()방법. 형식에서 이 메서드는 파일 읽기 방식과 매우 유사합니다. 동일한 인수, 다른 선택적 매개변수 및 메서드 이름의 소문자만 다를 뿐입니다.

 

fs.readdir("some/dir", (err, entries) => {
    if (!err) {
        console.log(entries); // ["file1.js", "file2.js"]
    }
});

options 객체에서 인코딩은 기본적으로 "utf8"지금 (로 설정 "buffer"버퍼를 원하는 경우) 및 두 번째, withFileTypes부울 설정 중 true, 결과 배열 fs.Dirent인스턴스, 다음과 같은 방법으로 유용한 정보 제공 .isDirectory(), .isFile(), 또는 .isSymbolicLink().

 

fs.readdir("some/dir", {withFileTypes: true }, (err, entries) => {
    if (!err) {
        entries.forEach(entry => {
            console.log(entry.isFile()); // true
        });
    }
});

연결

쉽게 얻을 수 있습니다. 소스 경로 를 fs.readlink(). 형식은 인코딩만 포함하는 선택적 개체 속성이 있는 이전 방법과 유사하며 기본값은 다음과 같습니다. "utf8".

 

fs.readlink("symlinkedFile.js", (err, link) => {
    if (!err) {
        console.log(link); // symlink source path 
    }
});

파일 기술자

마지막으로 중요한 것은 fs.open(). FS 읽기 및 쓰기와 관련된 거의 모든 Node.js 메서드에서 내부적으로 사용하는 하위 수준 메서드입니다. 경로, 시스템 플래그 문자열, 선택적 모드 번호 및 콜백 함수가 주어지면 전달된 인수에 따라 나중에 읽기, 쓰기 또는 무엇이든 사용할 수 있는 파일을 생성, 읽기 또는 재생성할 수 있습니다. 와 비교하여 아는 것이 중요합니다. fs.access(), 이 메서드의 모드 매개변수는 다음과 같이 다시 설정할 수 있습니다. fs.constants( 파일 열기 상수 ), 하지만 이번에는 다음으로 시작합니다. O_- 예 O_RDONLY, O_WRONLY.

 

fs.open("file.js", "r+", fs.constants.O_RDWR, (err, fd) => {
    if (!err) {
        console.log(fd);
    }
});

다시 말하지만, 이것은 좀 더 낮은 수준의 방법이며 일상적인 작업에 사용하지 않을 가능성이 큽니다. 여기서 가장 중요한 것 중 하나는 반환되는 값입니다. 종종 fd 합니다. 이른바 파일 디스크립터 입니다. 기본적으로 주어진 파일의 정수 ID입니다. FS 모듈 문서 전체에서 매우 자주 참조되며 다음과 같은 다른 저수준 방법에서 사용됩니다. fs.read()또는 fs.write()버퍼와 더 깊이 상호 작용합니다. 다시 말하지만, 대부분의 FS 작업에 실제로 필요하지 않으므로 다루지 않습니다. 그러나 더 흥미로운 점은 다음과 같은 일부 FS 메서드의 경로 대신 파일 설명자를 사용할 수도 있습니다. fs.readFile().

 

fs.open("file.js", "r+", fs.constants.O_RDWR, (err, fd) => {
    if (!err) {
        fs.readFile(fd, "utf8", (err, data) => {
            if (!err) {
                console.log(data);
            }
        });
    }
});

"열린" 파일 fs.open()나중에 매우 간단한 방법으로 "닫을" 수 있습니다. fs.close()파일 설명자와 콜백만 사용합니다.

 

fs.close(fd, () => {
    if (!err) {
        // ...
    }
});

보시다시피 파일 읽기는 매우 쉽습니다. 당신은 이것들에 대해 조금 알 필요가 있습니다 fs.constants및 파일 시스템 플래그. 그러나 고급 사용 및 최신 TS 지원 IDE 또는 자동 완성 기능이 있는 코드 편집기만 해당 항목을 기억하는 작업을 수행할 가능성이 큽니다. 또한 위의 예가 당신을 장님으로 만들지 않도록 하십시오. FS 오류를 처리 하는 것은 단순한 if-check보다 조금 더 주의가 필요합니다. 마지막으로 왜 단지 fs.readFile()로 작성되었습니다 camelCase ( -Sync 대응과는 별도로). 그것은 그들이 나타내는 것 . camelCase로 작성된 메소드는 Node.js 자체에서 구현한 메소드이고, 나머지 메소드는 POSIX C 함수를 모델로 한 것입니다. 앞으로 나올 모든 방법도 마찬가지입니다. 단일 단어를 염두에 두십시오!

 

글쓰기

FS 관련 항목에서 쓰기는 두 가지 방식으로 이해될 수 있습니다. 파일에 일부 콘텐츠를 작성하거나 파일 시스템에 대한 모든 종류의 변경 사항 (파일 변경 포함)을 작성하는 것입니다. 여기서는 두 번째로 더 광범위한 접근 방식을 사용합니다.

 

파일 쓰기

캐주얼한 파일 내용 작성부터 시작하여 fs.writeFile()방법. 여기에서 쓰기 가능한 파일(또는 파일 디스크립터)의 경로, 로 기록할 데이터 문자열 또는 버퍼 형태 추가 옵션 개체에는 플래그(파일 시스템 플래그 문자열 - "w"기본적으로 제공하는 데이터에 대한 인코딩(기본값은 "utf8") 및 모드 속성 또는 인코딩만 지정하는 단순 문자열일 수 있습니다. 그러나 대부분의 경우 그것들 없이도 괜찮을 것입니다.

 

fs.writeFile("file.js", "Data to be written", err => {
    if (!err) {
        console.log("Written");
    }
});

하는 동안 fs.writeFile()완전히 지우고 파일의 이전 내용을 fs.appendFile()하고 싶을 때 무언가를 추가 합니다. 호출 구조는 다음과 거의 같습니다. fs.writeFile()하나는 선택적 파일 시스템 플래그 문자열(파일 속성)이 기본적으로 "a"추가를 허용합니다.

 

fs.appendFile("file.js", "Data to be appended", err => {
    if (!err) {
        console.log("Appended");
    }
});

마지막으로 다음 자를 을 사용하여 주어진 파일의 현재 내용을 fs.truncate(). 파일의 경로와 자르려는 길이를 나타내는 숫자만 사용합니다. 아, 그리고 확실히 콜백입니다.

 

fs.truncate("file.js", 10, err => {
    if (!err) {
        console.log("Truncated");
    }
});

제공된 길이가 주어진 파일의 길이를 초과하면 null 문자 원치 않는 이상한 문자가 남습니다. 파일 설명자와 함께 이 방법을 사용할 수 없습니다. 이를 위해 직접 대응하는 것을 사용할 수 있습니다. fs.ftruncate().

 

디렉토리

Node.js는 디렉토리 변경/쓰기와 관련된 메소드 세트도 제공합니다. 많은 터미널 사용자에게 잘 알려진 것 중 하나는 fs.mkdir(). 에 대한 경로를 사용합니다 새 디렉토리 , 옵션 객체(선택 사항) 및 콜백 함수 을 전달할 수 재귀 경로 내에서 제공된 디렉터리로 연결되는 상위 디렉터리가 아직 존재하지 않는 경우 생성되어야 하는지 여부를 나타내는

 

fs.mkdir("my/new/dir", {recursive: true}, err => {
    if(!err) {
        console.log("Created");
    }
});

새 디렉토리가 일부 임시 데이터 을 사용해야 합니다. fs.mkdtemp()방법. 와는 조금 다릅니다 fs.mkdir(). 경로 대신에 경로 접두사 매개변수 와 유사한 6개의 임의 문자 가 추가됩니다. Options 객체는 인코딩 속성을 사용합니다(기본값은 "utf8") 처리된 경로의 인코딩을 나타내지만 문자열 형식을 사용할 수도 있습니다. 마지막으로 새 임시 디렉토리의 이름과 함께 콜백(표준 err 인수 제외)이 제공됩니다.

 

const fs = require("fs");
const os = require("os");
const path = require("path");

fs.mkdtemp(path.join(os.tmpdir(), "mydir"), (err, tempDir) => {
  if (!err) {
    console.log(tempDir); // e.g. /tmp/mydirY4ciGj on Linux
  }
});

OS의 임시 폴더에 임시 디렉토리를 생성하는 신중한 방법을 따르십시오. 자동으로 수행되지 않습니다!

 

마지막으로 명령으로 주어진 디렉토리를 제거 간단한 fs.rmdir()전화 - ​​표준 물건. 제거하기 전에 디렉토리가 비어 있어야 합니다!

 

fs.rmdir("dir/to/remove", err => {
    if (!err) {
        console.log("Removed");
    }
});

 

연결

하드 및 심볼릭 링크를 생성하는 것도 FS에 변경 사항을 기록하는 활동으로 간주될 수 있습니다. Node.js에서는 심볼릭 링크를 만들 멋진 fs.symlink()방법. 링크의 대상과 경로를 사용합니다.

 

fs.symlink("target/to/symlink", "symlink/dir", err => {
    if (!err) {
        console.log("Symlinked");
    }
});

만이 Windows 요구함으로써 삶을 더 어렵게 만들 필요가 형식 매개변수 다른 플랫폼이 지원하지 않는 문자열이며 다음 값을 가질 수 있습니다. "dir", "file", 또는 "junction", 심볼릭 링크의 대상 유형을 존중합니다.

 

하드 링크 는 다음으로 생성할 수 있습니다. fs.link()방법과 마찬가지로 fs.symlink()그러나 이번에는 Windows 유형 매개변수가 없습니다.

 

fs.link("target/to/link", "link/dir", err => {
    if (!err) {
        console.log("Linked");
    }
});

링크는 다음을 사용하여 제거할 수 . 있습니다 fs.unlink()그 길을 제공합니다. 파일 링크만 이 방법으로 작동합니다. 디렉토리의 경우 앞에서 언급한 사용 fs.rmdir().

 

fs.unlink("link/dir", err => {
    if (!err) {
        console.log("Unlinked");
    }
});

 

기타 변경 사항

위의 모든 장점 외에도 Node.js에서 파일의 이름을 바꾸거나 복사할 수도 있습니다. 첫 번째 작업은 다음으로 수행할 수 있습니다. fs.rename()메서드, 현재 및 새 경로 외에는 필요하지 않으며 자연스럽게 콜백됩니다.

 

fs.rename("file.js", "renamedFile.js", err => {
  if (!err) {
    console.log("Renamed");
  }
});

파일 복사는 조금 더 까다로우며 다음을 사용해야 합니다. fs.copyFile()메서드를 사용하고 소스 및 대상 경로뿐만 아니라 일부 플래그(선택 사항)도 전달합니다. 다음에서 사용할 수 있는 상수로 설정할 수 있습니다. fs.constants( 파일 복사 상수 ) - COPYFILE_EXCL, COPYFILE_FICLONE, 그리고 COPYFILE_FICLONE_FORCE모두 소스와 대상 간의 관계를 나타냅니다.

 

 

fs.copyFile("file.js", "dest.js", err => {
  if (!err) {
      console.log("Copied");
  }
});

 

출처: https://dev.to/areknawo/node-js-file-system-api-beginner-friendly-guide-b6l

 

728x90
반응형

'Programing' 카테고리의 다른 글

uglify option  (0) 2022.06.08
TDD의 이유  (0) 2022.06.03
postgresql source compile  (0) 2022.05.30
Storybook을 다양한 Addon과 함께 활용해보면서 사용법 정복하기  (0) 2021.07.23
TDD란? 어떻게 해야 되는것일까요?  (0) 2021.05.10

댓글