수색…


비고

Node.js에서 I / O와 같은 리소스를 많이 사용하는 작업은 비동기 적 으로 수행되지만 동기 대응이 있습니다 (예 : fs.readFile 이 있고 fs.readFile 가 해당 항목 fs.readFileSync ). Node는 단일 스레드이므로 동기 작업을 사용할 때는 전체 프로세스를 차단하므로주의해야합니다.

프로세스가 동기 작업에 의해 차단되면 전체 실행주기 (이벤트 루프 포함)가 중지됩니다. 즉, 이벤트 및 이벤트 핸들러를 포함하여 다른 비동기 코드가 실행되지 않으며 프로그램은 단일 차단 작업이 완료 될 때까지 계속 대기합니다.

동기 및 비동기 작업 모두에 적절한 용도가 있지만 올바르게 활용되어야합니다.

writeFile 또는 writeFileSync를 사용하여 파일에 쓰기

var fs = require('fs');

// Save the string "Hello world!" in a file called "hello.txt" in
// the directory "/tmp" using the default encoding (utf8).
// This operation will be completed in background and the callback
// will be called when it is either done or failed.
fs.writeFile('/tmp/hello.txt', 'Hello world!', function(err) {
  // If an error occurred, show it and return
  if(err) return console.error(err);
  // Successfully wrote to the file!
});

// Save binary data to a file called "binary.txt" in the current
// directory. Again, the operation will be completed in background.
var buffer = new Buffer([ 0x48, 0x65, 0x6c, 0x6c, 0x6f ]);
fs.writeFile('binary.txt', buffer, function(err) {
  // If an error occurred, show it and return
  if(err) return console.error(err);
  // Successfully wrote binary contents to the file!
});

fs.writeFileSync 유사하게 동작 fs.writeFile 하지만 기적 때문에 블록 메인 스레드를 완료로 콜백을지지 않습니다. 대부분의 node.js 개발자는 프로그램 실행을 거의 지연시키지 않는 비동기 변형을 선호합니다.

참고 : 주 스레드를 차단하는 것은 node.js에서 좋지 않습니다. 동기 기능은 디버깅 할 때 또는 다른 옵션을 사용할 수없는 경우에만 사용해야합니다.

// Write a string to another file and set the file mode to 0755
try {
  fs.writeFileSync('sync.txt', 'anni', { mode: 0o755 });
} catch(err) {
  // An error occurred
  console.error(err);
}

파일에서 비동기 적으로 읽기

모든 파일 작업에 파일 시스템 모듈을 사용하십시오.

const fs = require('fs');

인코딩 사용

이 예에서는 /tmp 디렉토리에서 hello.txt 를 읽습니다. 이 작업은 백그라운드에서 완료되며 콜백은 완료 또는 실패시 발생합니다.

fs.readFile('/tmp/hello.txt', { encoding: 'utf8' }, (err, content) => {
  // If an error occurred, output it and return
  if(err) return console.error(err);

  // No error occurred, content is a string
  console.log(content);
});

인코딩하지 않고

백그라운드에서 비동기 적으로 현재 디렉토리의 binary.txt 파일을 읽으십시오. 우리가 'encoding'옵션을 설정하지 않는다는 것에주의하십시오. 이렇게하면 Node.js가 내용을 문자열로 디코딩하지 못합니다 :

fs.readFile('binary', (err, binaryContent) => {
  // If an error occurred, output it and return
  if(err) return console.error(err);

  // No error occurred, content is a Buffer, output it in
  // hexadecimal representation.
  console.log(content.toString('hex'));
});

상대 경로

일반적인 경우, 스크립트는 임의의 현재 작업 디렉토리로 실행될 수 있습니다. 현재 스크립트와 관련된 파일 주소를 지정하려면 __dirname 또는 __filename 사용 __filename .

fs.readFile(path.resolve(__dirname, 'someFile'), (err, binaryContent) => {
  //Rest of Function
}

readdir 또는 readdirSync를 사용하여 디렉토리 내용 표시

const fs = require('fs');

// Read the contents of the directory /usr/local/bin asynchronously.
// The callback will be invoked once the operation has either completed
// or failed.
fs.readdir('/usr/local/bin', (err, files) => {
  // On error, show it and return
  if(err) return console.error(err);

  // files is an array containing the names of all entries
  // in the directory, excluding '.' (the directory itself)
  // and '..' (the parent directory).

  // Display directory entries
  console.log(files.join(' '));
});

동기 변형은 주 스레드를 차단하므로 동시에 비동기 코드의 실행을 막는 readdirSync 로 사용할 수 있습니다. 대부분의 개발자는 성능을 향상시키기 위해 동기 IO 기능을 사용하지 않습니다.

let files;

try {
  files = fs.readdirSync('/var/tmp');
} catch(err) {
  // An error occurred
  console.error(err);
}

생성기 사용

const fs = require('fs');

// Iterate through all items obtained via
// 'yield' statements
// A callback is passed to the generator function because it is required by
// the 'readdir' method
function run(gen) {
  var iter = gen((err, data) => {
    if (err) { iter.throw(err); }

    return iter.next(data);
  });

  iter.next();
}

const dirPath = '/usr/local/bin';

// Execute the generator function
run(function* (resume) {
  // Emit the list of files in the directory from the generator
  var contents = yield fs.readdir(dirPath, resume);
  console.log(contents);
});

파일에서 동 기적으로 읽기

모든 파일 작업에 대해 filesystem 모듈이 필요합니다.

const fs = require('fs');

문자열 읽기

fs.readFileSync 유사하게 동작 fs.readFile 하지만 기적 때문에 블록 메인 스레드를 완료로 콜백을지지 않습니다. 대부분의 node.js 개발자는 프로그램 실행을 거의 지연시키지 않는 비동기 변형을 선호합니다.

encoding 옵션이 지정되면 문자열이 반환되고 그렇지 않으면 Buffer 가 반환됩니다.

// Read a string from another file synchronously
let content;
try {
  content = fs.readFileSync('sync.txt', { encoding: 'utf8' });
} catch(err) {
  // An error occurred
  console.error(err);
}

비동기 적으로 파일 삭제 :

var fs = require('fs');

fs.unlink('/path/to/file.txt', function(err) {
  if (err) throw err;

  console.log('file deleted');
});

동시에 삭제할 수도 있습니다 * :

var fs = require('fs');

fs.unlinkSync('/path/to/file.txt');
console.log('file deleted');

* 실행이 끝날 때까지 전체 프로세스를 차단하기 때문에 동기 메서드를 사용하지 마십시오.

스트림을 사용하여 파일을 버퍼로 읽는 중

파일로부터 내용을 읽는 것은 fs.readFile() 메소드를 사용하여 이미 비동기이지만 때때로 간단한 콜백 대 스트림에서 데이터를 얻고 싶습니다. 이를 통해 우리는이 데이터를 다른 위치로 보내거나 처리 할 때 한 번에 한꺼번에 처리 할 수 ​​있습니다.

const fs = require('fs');

// Store file data chunks in this array
let chunks = [];
// We can use this variable to store the final data
let fileBuffer;

// Read file into stream.Readable
let fileStream = fs.createReadStream('text.txt');

// An error occurred with the stream
fileStream.once('error', (err) => {
    // Be sure to handle this properly!
    console.error(err); 
});

// File is done being read
fileStream.once('end', () => {
    // create the final data Buffer from data chunks;
    fileBuffer = Buffer.concat(chunks);
    
    // Of course, you can do anything else you need to here, like emit an event!
});

// Data is flushed from fileStream in chunks,
// this callback will be executed for each chunk
fileStream.on('data', (chunk) => {
    chunks.push(chunk); // push data chunk to array

    // We can perform actions on the partial data we have so far!
});

파일 또는 디렉토리의 권한 확인

fs.access() 는 경로가 있는지 여부와 사용자가 해당 경로의 파일이나 디렉토리에 대해 가지는 사용 권한을 결정합니다. fs.access 는 결과를 리턴하지 않고, 오류를 리턴하지 않으면 경로가 존재하고 사용자에게 원하는 권한이 있습니다.

권한 모드는 fs 객체의 속성으로 사용할 수 있습니다. fs.constants

  • fs.constants.F_OK - 읽기 / 쓰기 / 실행 권한이 있습니다 (모드가 제공되지 않으면 기본값 임).
  • fs.constants.R_OK - 읽기 권한이 있습니다.
  • fs.constants.W_OK - 쓰기 권한이 있습니다.
  • fs.constants.X_OK - 실행 권한이 있습니다 (Windows에서 fs.constants.F_OK 와 동일하게 fs.constants.F_OK 함).

비동기 적으로

var fs = require('fs');
var path = '/path/to/check';

// checks execute permission
fs.access(path, fs.constants.X_OK, (err) => {
    if (err) {
        console.log("%s doesn't exist", path);
    } else {
        console.log('can execute %s', path);
    }
});
// Check if we have read/write permissions
// When specifying multiple permission modes
// each mode is separated by a pipe : `|`
fs.access(path, fs.constants.R_OK | fs.constants.W_OK, (err) => {
    if (err) {
        console.log("%s doesn't exist", path);
    } else {
        console.log('can read/write %s', path);
    }
});

동기식으로

fs.access 에는 동기 버전 인 fs.accessSync 있습니다. fs.accessSync 를 사용할 때 try / catch 블록 내에 동봉해야합니다.

// Check write permission
try {
    fs.accessSync(path, fs.constants.W_OK);
    console.log('can write %s', path);
}
catch (err) {
    console.log("%s doesn't exist", path);
}

기존 디렉토리를 만들거나 사용할 때 경합 조건 피하기

노드의 비동기 특성으로 인해 먼저 디렉토리를 만들거나 사용하는 경우 :

  1. fs.stat() 로 그 존재를 fs.stat() 다음,
  2. 존재 확인의 결과에 따라 그것을 생성하거나 사용하며,

검사 시간과 생성 시간 사이에 폴더가 생성되면 경쟁 조건이 발생할 수 있습니다. 아래의 메소드는 fs.mkdir()fs.mkdirSync() 를 코드가 EEXIST (이미 존재하는 경우)가 통과하도록하는 에러 포착 래퍼를 래핑합니다. EPERM (pemission denied)과 같이 오류가 다른 경우, 원시 함수처럼 오류를 던지거나 전달하십시오.

fs.mkdir()fs.mkdir() 비동기 버전

var fs = require('fs');

function mkdir (dirPath, callback) {
  fs.mkdir(dirPath, (err) => {
    callback(err && err.code !== 'EEXIST' ? err : null);
  });
}

mkdir('./existingDir', (err) => {

  if (err)
    return console.error(err.code);

  // Do something with `./existingDir` here

});

fs.mkdirSync() 와의 동기 버전

function mkdirSync (dirPath) {
  try {
    fs.mkdirSync(dirPath);
  } catch(e) {
    if ( e.code !== 'EEXIST' ) throw e;
  }
}

mkdirSync('./existing-dir');
// Do something with `./existing-dir` now

파일이나 디렉토리가 있는지 확인하기

비동기 적으로

var fs = require('fs');

fs.stat('path/to/file', function(err) {
    if (!err) {
        console.log('file or directory exists');
    }
    else if (err.code === 'ENOENT') {
        console.log('file or directory does not exist');
    }
});

동기식으로

여기서 우리는 try/catch 블록에서 함수 호출을 감싸서 오류를 처리해야합니다.

var fs = require('fs');

try {
    fs.statSync('path/to/file');
    console.log('file or directory exists');
}
catch (err) {
  if (err.code === 'ENOENT') {
    console.log('file or directory does not exist');
  }
}

스트림을 사용하여 파일 복제

이 프로그램은 파일 시스템 모듈이 제공하는 createReadStream()createWriteStream() 함수를 사용하여 읽고 쓰기 가능한 스트림을 사용하여 파일을 복사하는 방법을 보여줍니다.

//Require the file System module
var fs = require('fs');

/*
  Create readable stream to file in current directory (__dirname) named 'node.txt'
  Use utf8 encoding 
  Read the data in 16-kilobyte chunks
*/
var readable = fs.createReadStream(__dirname + '/node.txt', { encoding: 'utf8', highWaterMark: 16 * 1024 });

// create writable stream
var writable = fs.createWriteStream(__dirname + '/nodeCopy.txt');

// Write each chunk of data to the writable stream
readable.on('data', function(chunk) {
    writable.write(chunk);
});

파이핑 스트림을 통한 파일 복사

이 프로그램은 스트림 클래스가 제공하는 pipe() 함수를 사용하여 읽기 가능하고 쓰기 가능한 스트림을 사용하여 파일을 복사합니다.

// require the file system module
var fs = require('fs');

/*
    Create readable stream to file in current directory named 'node.txt'
    Use utf8 encoding 
    Read the data in 16-kilobyte chunks
*/
var readable = fs.createReadStream(__dirname + '/node.txt', { encoding: 'utf8', highWaterMark: 16 * 1024 });

// create writable stream
var writable = fs.createWriteStream(__dirname + '/nodePipe.txt');

// use pipe to copy readable to writable
readable.pipe(writable);

텍스트 파일의 내용 변경하기

예. 그것은 단순한 RegExp replace(/email/gim, 'name') 텍스트 파일 index.txtname 으로 email 이라는 단어를 대체 할 것입니다.

var fs = require('fs');
 
fs.readFile('index.txt', 'utf-8', function(err, data) {
    if (err) throw err;
 
    var newValue = data.replace(/email/gim, 'name');
 
    fs.writeFile('index.txt', newValue, 'utf-8', function(err, data) {
        if (err) throw err;
        console.log('Done!');
    })
})

텍스트 파일의 행 수 결정

app.js

const readline = require('readline');
const fs = require('fs');

var file = 'path.to.file';
var linesCount = 0;
var rl = readline.createInterface({
    input: fs.createReadStream(file),
    output: process.stdout,
    terminal: false
});
rl.on('line', function (line) {
    linesCount++; // on each linebreak, add +1 to 'linesCount'
});
rl.on('close', function () {
    console.log(linesCount); // print the result when the 'close' event is called
});

용법:

노드 앱

파일을 한 줄씩 읽음

app.js

const readline = require('readline');
const fs = require('fs');

var file = 'path.to.file';
var rl = readline.createInterface({
    input: fs.createReadStream(file),
    output: process.stdout,
    terminal: false
});

rl.on('line', function (line) {
    console.log(line) // print the content of the line on each linebreak
});

용법:

노드 앱



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow