-
NodeJS File의 다양한 사용법개발언어/Node.js 2022. 8. 2. 13:57
FileSystem
//const fs = require('fs'); const fs = require('fs').promises;
앞에서는 'fs'키워드를 이용해서 FileSystem 모듈을 가져왔다면, 이번에는 기본적으로 promise 형태인 FileSystem 모듈을 가져올 것이다. 즉 fs라는 변수는 FileSystem안에 있는 promise들을 가르키고 있는 것이다.
1.Read a file
//read a file fs.readFile("./text.txt") .then((data) => console.log(data)) .catch(console.error);
fs의 readFile()이라는 메서드를 이용한다. 해당 메서드의 인자로 file의 경로를 전달해 준다. 그 다음에 file에서 읽어오 data가 잘 읽어와 지면, console.log()를 통해서 data를 출력하고, error가 발생 하면 console.error를 통해서 error를 출력한다.
=> 실행 후 console 출력결과
=> 해당 file
해당 text.txt 파일에는 Hello!!가 적혀져 있는다.근데 메서드 readFile()은 Hello!!라는 data를 buffer형태로 읽어온다.
const fs = require("fs").promises; //read a file fs.readFile("./text.txt", "utf-8") .then((data) => console.log(data)) .catch(console.error);
메서드readFile()의 정의부에 가서 확인해보면, 메서드의 두번째 인자를 통해 optional로 encoding방식 혹은 flag값으로 file을 열때 읽기 mode로 열 것인지 쓰기 모드로 열 것인지 선택할 수 있다.
두번째 인자를 'utf-8' 넣어 encoding이 되게 하고 나서 결과를 출력한다.
=> 실행 후 console 출력결과
encoding된 text가 출력되는 것을 확인 할 수 있다.
2.Writing a file
//writing a file fs.writeFile("./file.txt", "Hello, World!!") .catch(console.error);
=> 코드 실행 후 디렉토리 구성
fs에 속한 writeFile() 메서드의 첫번째인자로 어디에 쓸건지 file의 경로를 문자열로 지정해 준 다음에 두번째 인자로 쓰려고 하는 내용을 넘겨주면 된다.
fs.writeFile()정의를 보면, Promise가 void type이라는 것을 확인 할 수 있다. 즉 이 메서드는 실행 결과롤 아무런 것도 return 되지 않는다. 그렇기 때문에 따로 then()을 사용하지 않아도 되지만 catch는 해주어야 한다. 항상 error 발생의 가능성이 있으므로 catch를 작성해 주는 것이 좋다.
=> 코드 실행 후 출력 결과
X(없음)
=> 코드 실행 후 디렉토리 구성
첫번째 인자로 넣은 경로에 file 생기고, 해당 파일에 두번째 인자로 넣은 내용이 정상적으로 출력되고 있는 것을 확인 할 수 있다.
Writing a file 이용해서 동일한 file에 다른 문자 넣기
//writing a file fs.writeFile("./file.txt", "Hi, World!!") .catch(console.error);
=> 코드 실행후 파일의 내용
file의 내용이 두번째인자로 전달한 값과 일치하는 것을 확인 할 수 있다.
appendFile()
fs.appendFile("./file.txt", "hi again") .catch(console.error);
기존에 file에 내용을 덮어 쓰고 싶은 것이 아니라 즉 기존의 data를 유지하면서, 추가적으로 내용을 적고 싶다면 fs의 appendFile()메서드를 사용하면 된다.
=> 코드 실행후 파일의 내용
3.Copy a file
copyfile
//copy fs.copyFile("./file.txt", "./file2.txt") .catch(console.error);
file을 복사하는 것도 가능한데 fs에 있는 copyFile()메서드를 이용해서 첫번째 인자로 복사해올 file의 경로를 두번째 인자로 전달한다.
copyFile()메서드도 void를 return 함으로 .catch()를 받아 준다.
=> 실행 후 출력 결과
=> 실행 후 디렉토리
정상적으로 file2.txt. file이 생성 되었지만 file2.txt를 열어 보면 아무런 내용도 적혀 있지 않은 것을 확인 할 수 있다. 왜냐하면 모든 것 들이 다 비동기적으로 처리 되어, data를 쓰기도 전에 file.txt를 복사하여 file2.txt를 복사 했을 수도 있다.
동기적으로 file생성후 복사
fs.appendFile("./file.txt", "hi again") .then(() => { //copy fs.copyFile("./file.txt", "./file2.txt") // .catch(console.error); }) .catch(console.error);
appendFile()메서드 뒤에 .then()메서드을 체인으로 달고 그안에 copyFile()을 실행하는 함수를 집어 넣어 , appendFile()를 수행하고 나서 문제가 없으면 copyFile()이 실행 되도록 해준다.
=> 실행 후 file2.txt
file.txt안에 적힌 내용까지 잘 복사되어 진 것을 확인 할 수 있다.
🔔비동기는 순차적으로 될 수 도 있고 안될 수도 있기 때문에 이점에 유의해서 코드를 작성해야 한다. 순서대로 코드를 작성했지만 모든 것이 다 Promise이므로 비동기적으로 처리가 되므로 순서가 보장이 되지 않는다. 순서가 중요한 경우라면 .then()안에서 해당하는 Promies가 수행이 된다음에 특정한 일을 해야 한다.
4.folder
mkdir()
디렉토리를 만드는 메서드 이다.
// folder fs.mkdir("sub-folder") .catch(console.error);
mkdir()도 반환하는 값이 없으로 동일하게 catch()를 이용하면 된다.
=> 실행 후 디렉토리
sub-folder가 정상적으로 생성된 것을 확인 할 수 있다.
readdir()
fs.readdir("./") // .then(console.log) .catch(console.error);
해당하는 경로에 있는 모든 file의 이름을 읽어 올 수 있다. 해당 함수의 반환되는 값이 string이므로 then()을 이용해서 return 값을 출력한다.
=> 실행 후 출력 결과
현재 경로안에 있는 모든 file들의 이른과 folder에 이름이 출력되는 것을 확인 할 수 있다.
API 사용시 주의 사항
api를 사용할 때는 항상
1.인자는 어떤 것이 있는지
2.추가적으로 전달해야하는 option같은 인자들이 있는지
3.함수에서 return 되는 값은 무엇인지
4.반환 type이 Promise라면, error 발생 시 catch()매서드를 사용해서 error를 잡아는 것이 중요하다.
'개발언어 > Node.js' 카테고리의 다른 글
NodeJS 서버 (0) 2022.08.02 NodeJS Buffer and Stream outline (0) 2022.08.02 NodeJS File async와 asynchronous 그리고 promise (0) 2022.07.28 NodeJS Path 그리고 유의할 점 (0) 2022.07.27 NodeJS Timer와 Call Stack의 연관 (0) 2022.07.09