>웹 프론트엔드 >프런트엔드 Q&A >nodejs의 어떤 모듈이 파일 작업 API를 제공합니까?

nodejs의 어떤 모듈이 파일 작업 API를 제공합니까?

青灯夜游
青灯夜游원래의
2021-11-10 11:59:432688검색

nodejs에서는 파일 시스템 모듈이 파일 작업 API를 제공합니다. 파일 시스템 모듈(fs 모듈이라고 함)을 사용하면 사용자는 fs 모듈을 사용하여 컴퓨터의 파일 시스템에 액세스하고 상호 작용할 수 있으며 파일 및 디렉터리의 생성, 쓰기, 삭제 및 기타 작업을 수행할 수 있습니다.

nodejs의 어떤 모듈이 파일 작업 API를 제공합니까?

이 튜토리얼의 운영 환경: windows7 시스템, nodejs 버전 12.19.0, DELL G3 컴퓨터.

1: 전체 파일 내용을 읽는 방법은 무엇입니까?

참고: 파일을 읽고 파일을 쓰는 것은 이해하기 지루할 수 있지만, 이런 기사를 공부할 때마다 다음 기사의 데모에 사용해야 하기 때문에 다음 기사에 대한 준비가 됩니다. 이 분야에서는 내가 이해해야 할 모든 지식을 기록하겠습니다.

Node.js에서는 fs 모듈을 사용하여 모든 파일과 디렉터리를 생성, 작성 및 삭제합니다.

1. 파일 읽기 방법:

파일 읽기 작업을 수행할 때 readFile 메서드와 readFileSync 메서드를 사용하여 파일을 읽을 수 있습니다. Sync와 같은 단어가 있는 것은 동기식 메서드입니다. 즉, 동기식 메서드와 비동기식 메서드의 차이점은 다음과 같습니다. 동기식 메서드는 작업 결과를 즉시 반환합니다. 먼저 관련 API를 살펴보겠습니다.

1) readFileSync는 파일 API를 동기적으로 읽습니다

사용 방법은 다음과 같습니다.

fs.readFileSync(filename, [options]);

filename 매개변수: 읽은 파일의 전체 파일 경로와 파일 이름을 지정하는 데 사용됩니다.

options 매개변수: 이 값은 파일을 읽을 때 플래그 속성을 사용하여 파일에 대해 수행할 작업을 지정할 수 있는 개체입니다. 지정할 수 있는 값은 다음과 같습니다.

  • 'r': 파일을 읽습니다. 파일이 없으면 예외가 발생합니다.

  • 'r+': 파일을 읽고 쓰며, 파일이 없으면 예외가 발생합니다.

  • 'rs': 파일을 동기적으로 읽고 운영 체제에 로컬 파일 시스템 캐시를 무시하도록 알립니다. 파일이 없으면 예외가 발생합니다.

  • 'w': 파일에 씁니다. 파일이 없으면 파일을 만듭니다. 파일이 이미 있으면 파일 내용을 지웁니다.

  • 'w+': 파일 읽기, 쓰기, 기타 기능은 'w'와 동일합니다.

  • 'a': 파일에 추가하고, 파일이 없으면 생성합니다.

  • 'a+': 파일을 읽고 추가하고, 파일이 없으면 생성합니다.

옵션 매개변수에서 인코딩 속성을 사용하여 파일을 읽는 데 사용할 인코딩 형식을 지정할 수 있습니다. 속성 값은 'utf-8', 'ascii', 'base64'입니다. 먼저 간단한 데모를 살펴보세요. 아래와 같이:

먼저 디렉터리 구조를 살펴보면 다음과 같습니다.

### 目录结构如下:
demo1                                       # 工程名
|   |--- readFile                           # 读取文件的文件夹            
|   | |-- index.html                        # html文件
|   | |-- index.js                          # js文件
|   | |-- package.json          
|   | |-- node_modules

다음 코드는 파일 코드를 읽습니다.

const fs = require('fs');
try {
  const data = fs.readFileSync('./index.html', 'utf-8');
  // 等待操作结果返回,然后打印结果
  console.log(data);
} catch(e) {
  console.log('读取文件发生错误');
}

명령줄에서 node index.js를 실행한 후 다음과 같이 결과를 인쇄합니다.

2) 비동기 읽기 파일의 API 사용법은 다음과 같습니다.

fs.readFile(filename, [options], callback);

파일 이름 및 옵션은 동기화 방법의 매개 변수와 동일합니다.

콜백 매개변수는 파일을 읽은 후 실행하는 데 사용되는 콜백 함수입니다. 다음 코드와 같이

const fs = require('fs');
fs.readFile('./index.html', 'utf-8', (err, data) => {
  if (err) {
    console.log('读取文件时发生错误');
  } else {
    console.log(data);
  }
});

실행 결과는 위와 동일합니다. 여기에는 스크린샷이 없습니다.

2: 전체 파일 내용을 작성하는 방법은 무엇입니까?

파일을 쓰기 위해 fs 모듈에서 writeFile 메소드나 wirteFileSync 메소드를 사용합니다. writeFile을 사용하는 방법은 다음과 같습니다(wirteFileSync 방법은 콜백 매개변수가 없다는 점을 제외하면 유사합니다).

fs.writeFile(filename, data, [options], callback);

filename 매개변수는 작성해야 하는 파일의 전체 경로와 파일 이름을 지정합니다.

data 매개변수 작성해야 하는 내용을 지정하기 위해 값은 문자열 또는 Buffer 객체일 수 있으며 문자열이나 버퍼의 내용이 파일에 완전히 기록됩니다.

options 값은 개체(선택 사항)이고 옵션 이름은 플래그이며 다음과 같은 옵션 값이 있습니다.

  • 'flag': 파일에 대해 수행할 작업을 지정하는 데 사용되며 기본값은 'w'입니다. , 의미는 파일에 쓰기입니다. 이 지정된 항목의 모든 값은 위의 readFile 값과 동일합니다.

    (파일이 없으면 생성하고, 파일이 있으면 덮어씁니다.)

  • 'mode': 이 속성은 파일이 열릴 때 파일에 대한 읽기 및 쓰기 권한을 지정하는 데 사용됩니다. 기본값은 0666(읽기 및 쓰기 가능)입니다. Baidu에서는 배울 수 있는 가치가 많이 있습니다.

  • '인코딩': 파일을 작성하는 데 사용할 인코딩 형식을 지정하는 데 사용됩니다. 지정할 수 있는 속성값은 'utf8', 'ascii', 'base64'이다.

  • callback: 파일 읽기가 완료되었을 때 실행되는 콜백 함수에 사용되는 매개변수입니다.

간단하게 데모를 만들고 디렉터리의 index.js 파일에 코드를 작성하고 이 디렉터리에 message.txt 파일을 만들고 두 줄의 텍스트를 작성해 보겠습니다. 다음 코드:

const fs = require('fs');
const str = '这是第一行。\r\n这是第二行';
fs.writeFile('./message.txt', str, (err) => {
  if (err) {
    console.log('写入文件操作失败');
  } else {
    console.log('写入文件操作成功');
  }
});

아래와 같이 명령을 실행합니다.

아래와 같이 해당 디렉터리에 message.txt 파일이 생성됩니다

然后我们打开文件,会看到其写入的内容。

2)写入buffer对象,如下代码:

const fs = require('fs');
const str = new Buffer('我喜爱编程');
fs.writeFile('./message.txt', str, (err) => {  if (err) {
    console.log('写入文件操作失败');
  } else {
    console.log('写入文件操作成功');
  }
});

在message.txt中可以看到 '我喜爱编程' 几个字。

3)设置options参数flag属性选项,比如追加数据这些,如下代码:

const fs = require('fs');
const options = {
  flag: 'a'};
fs.writeFile('./message.txt', '这是追加的数据', options, (err) => {  if (err) {
    console.log('写入文件操作失败');
  } else {
    console.log('写入文件操作成功');
  }
});

message.txt内容编程如下了:我喜爱编程这是追加的数据

4)复制图片文件

我们可以通过readFile方法读取应用程序对应目录下的一个图片文件,在读取文件时使用base64编码,在该回调函数中使用writeFile方法,在该方法中使用base64编码将读取到的图片文件数据复制到另一个图片文件中。如下代码:

const fs = require('fs');

fs.readFile('./images/1.png', 'base64', (err, data) => {
  fs.writeFile('./images/xx.png', data.toString(), 'base64', (err) => {    if (err) {
      console.log('写文件操作失败');
    } else {
      console.log('写文件操作成功');
    }
  });
});

在image下有一个 1.png, 它会先复制,然后写入 xx.png中(该文件之前不存在的,会创建该图片文件)。

三:如何在文件中的指定位置处读入内容?

3.1)打开文件open方法或openSync方法

要实现在文件中的指定位置处读入内容,首先我们需要打开该文件,fs模块中的open方法或openSync方法打开文件。open方法使用方式如下所示:

fs.open(filename, flags, [mode], callback);

前三个参数和readFile的参数是一个意思的。最后一个参数是执行完成后的回调函数。该回调函数有两个参数,第一个是打开文件失败时的错误对象,第二个参数为一个整数值,代表打开文件时返回的文件描述符。

下面我们来打开我们刚刚创建的 message.txt文件,如下代码:

const fs = require('fs');

fs.open('./message.txt', 'r', (err, fd) => {
  console.log(fd);
});

执行结果如下所示:

3.2)从指定的位置读取文件

如上面打开文件之后,我们可以在其回调函数使用fs模块中的read方法或readSync方法从文件的指定位置处读取文件,也可以使用fs模块中的write方法或writeSync方法从文件中指定处写入数据。

fs.read(fd, buffer, offset, length, position, callback);

fd参数是 上面open打开文件返回的文件描述符。

buffer参数 是一个buffer对象,用于指定将文件数据读取到那个缓存区中。

offset:用于指定向缓冲区中写入数据的开始位置。

length:用于指定从文件中读取的字节数。

position: 用于指定读取文件时的开始位置。

callback:用于指定文件操作完毕时的回调函数。如下所示:

function(err, bytesRead, buffer) {}
  • err: 为操作失败时的错误对象。

  • bytesRead: 代表实际读取的字节数。

  • buffer:为被读取的缓冲区对象。

下面我们来看个demo代码如下:

const fs = require('fs');
// message.txt 内容为:我喜爱编程这是追加的数据
fs.open('./message.txt', 'r', (err, fd) => {
  const buf = new Buffer(255);
  // 一个汉字的utf编码为三个字节数据
  fs.read(fd, buf, 0, 9, 3, (err, bytesRead, buffer) => {
    console.log(buffer.slice(0, bytesRead).toString()); // 喜爱编  });
});

如上代码message.txt内容为:我喜爱编程这是追加的数据,position为3,从第三个字节开始读取文件,然后长度为9个字节,一个汉字3个字节,因此结果为 '喜爱编';

四:如何在文件中的指定位置处写入内容?

在文件被打开后,可以使用fs模块中的write方法或writeSync方法从一个缓存区中读取数据并从文件的指定位置处写入这些数据。使用方法如下所示:

fs.write(fd, buffer, offset, length, position, callback);

fd参数为描述符。

buffer参数为一个Buffer对象,用于指定从哪个缓存区中读取数据。

offset参数用于指定从缓存区中读取数据时的开始读取位置。

length参数用于指定从缓存区中读取的字节数。

position参数值用于指定写入文件时的开始位置。

callback参数用于指定文件写入操作执行完毕时的回调函数。该回调函数如下:

function(err, written, buffer) {}
  • err参数为写入失败时的错误对象。

  • written: 代表被写入的字节数。

  • buffer: 代表被读取的缓冲区对象。

下面是一个简单的demo,如下所示:

const fs = require('fs');

const buf = new Buffer('我喜爱编程');

fs.open('./message.txt', 'w', (err, fd) => {
  fs.write(fd, buf, 3, 9, 0, (err, written, buffer) => {    if (err) {
      console.log('写文件操作失败');
    } else {
      console.log('写文件操作成功');
    }
  });
});

在message.txt中显示为 喜爱编 这三个字。

五:如何创建与读取目录?

5.1) 创建目录mkdir和mkdirSync方法

在fs模块中,可以使用mkdir方法创建目录,该方法使用方式如下所示:

fs.mkdir(path, [mode], callback);
  • path参数用于指定需要被创建的目录完整路径及目录名。

  • mode参数用于指定该目录的权限,默认值为0777(表示任何人可读写该目录)。

  • callback是回调函数。

下面是一个简单的demo,如下所示:

const fs = require('fs');

fs.mkdir('./test', (err) => {  if (err) {
    console.log('创建目录操作失败');
  } else {
    console.log('创建目录操作成功');
  }
});

如下所示:

5.2)读取目录readdir和readdirSync方法

在fs模块中,使用readdir方法读取目录,该方法使用如下所示

fs.readdir(path, callback);

path参数用于指定需要被读取的目录的完整路径及目录名。

callback参数用于指定读取目录操作的回调函数。该回调函数如下所示:

function(err, file) {}
  • err 为读取目录操作失败的回调函数。

  • file参数值为一个数组,读取到的文件中的所有文件名。

如下demo所示:

const fs = require('fs');

fs.readdir('./', (err, files) => {  if (err) {
    console.log('读取目录操作失败');
  } else {
    console.log(files);
  }
});

如下图所示:

六:如何查看与修改文件或目录的信息?

6.1)查看文件或目录的信息

在fs模块中,可以使用stat方法或lstat方法查看一个文件或目录的信息。这两个方法唯一的区别是当查看符号链接文件的信息
时,必须使用lstat方法。使用方法如下所示:

fs.stat(path, callback);
fs.lstat(path, callback);

path参数用于被查看的文件或目录的完整路径及文件名或目录名。

callback是回调函数。如下回调函数

function(err, stats) {}
  • err 参数值为查看文件或目录信息操作失败时触发的错误对象。

  • stats参数值为一个 fs.Stats对象,该对象有如下一些方法,在这些方法中不包含任何参数。

isFile: 用于判断被查看的对象是否为一个文件,如果是则返回true,否则的话返回false。

isDirectory: 用于判断被查看的对象是否为一个目录,如果是的话返回true,否则的话返回false。

还有很多很多其他的方法,这里不一一介绍,用的比较少,有需要的话,可以自己百度一下看看。

下面是使用 stat的使用demo,查看应用程序根目录下的 message.txt文件并且在回调函数中的第二个参数值 fs.Stats对象在控制台中的输出有哪些?

const fs = require('fs');

fs.stat('./message.txt', (err, stats) => {
  console.log(stats);
});

如下图所示显示:

6.2)检查文件或目录是否存在exists和existsSync方法

在fs模块中,可以使用exists方法检查一个文件或目录是否存在,该方法使用方式如下所示:

fs.exists(path, callback);

path参数:用于指定需要被检查的文件或目录的完整路径。
callback: 是回调函数,该回调函数如下所示:

function(exists) {}
  • exists参数,当文件或目录存在时,该参数值为true,否则的话,该参数值为false。

下面是一个简单的demo,如下代码所示:

const fs = require('fs');

// 该目录是存在的
fs.exists('./message.txt', (exists) => {
  console.log(exists); // true
});

// 该目录是不存在的
fs.exists('./message2.txt', (exists) => {
  console.log(exists); // false
});

6.3) 获取文件或目录的绝对路径realpath和realpathSync方法

在fs模块中,可以使用 realpath方法获取一个文件或目录的绝对路径,该方法使用如下所示:

fs.realpath(path, [cache], callback);
  • cache 参数是可选的,path和callback是必须的。

  • path参数为需要查看的文件或目录的完整路径。

  • cache参数为一个对象,其中存放了一些预先指定的路径。具体的百度下,这个参数用的不多。

  • callback是回调函数,该回调函数有2个参数,err参数值为获取目录的绝对路径失败的错误对象。resolvedPath参数值为获取
    到的文件或目录的绝对路径。

下面是一个简单的demo,如下所示:

const fs = require('fs');

fs.realpath('./message.txt', (err, resolvedPath) => {  if (err) {    throw err;
  } else {
    console.log(resolvedPath);
  }
});

执行如下所示:

6.4) 使用ReadStream对象读取文件

在fs模块中,可以使用createReadStream方法创建一个将文件内容读取为流数据的ReadStream对象,该方法使用如下所示:

fs.createReadStream(path, [options]);

path 该参数用于指定需要被读取的文件的完整路径及文件名。

options为一个对象,它有如下属性:

  • flags: 用于指定对该文件采取什么操作,默认值为 'r', 它的用法和readFile方法中的flags属性一样的。

  • encoding: 指定使用什么编码来读取该文件,可指定的值有 'utf8', 'ascii', 'base64'. 默认值为null.

  • start: 指定文件的开始读取位置。

  • end: 指定文件的结束读取位置。

还有很多其他的参数,这里不一一讲解,可以自行百度下即可。

下面简单的使用一个demo来了解下使用:如下代码:

const fs = require('fs');/*
 一个汉字三个字节,message.txt的内容为:我喜爱编写代码
 因此从第三个位置开始,到第十二个位置结束,因此数据应该为 喜爱编写*/const options = {
  start: 3, 
  end: 12};
const file = fs.createReadStream('./message.txt', options);

file.on('open', (fd) => {
  console.log('开始读取文件');
});

file.on('data', (data) => {
  console.log('读取到的数据:' + data);
});

file.on('end', () => {
  console.log('文件已全部读取完毕');
});

file.on('close', () => {
  console.log('文件被关闭');
});

file.on('error', (err) => {
  console.log('读取文件失败');
});

如下图所示:

我们可以使用 ReadStream对象的pause方法暂停data事件的触发,同时也意味着停止文件的读取操作。而已经被读取到的操作系统缓存区中的数据也将被暂时保存在操作系统缓冲区中,在使用了pause方法暂停data事件的触发之后,也可以使用ReadStream对象的resume方法恢复data事件的触发,也就意味着可以继续读取文件的数据。

如下demo:

const fs = require('fs');

const readStream = fs.createReadStream('./message.txt');

readStream.pause();

readStream.on('data', (data) => {
  console.log('获取到的数据为:' +data);
});

setTimeout(() => {
  readStream.resume();
}, 1000);

读取过程中,断听了一秒后,继续把数据读出来了。

注意:写入文件的方法是 WriteStream, 使用方式和读方式类似,这里不多介绍。

【推荐学习:《nodejs 教程》】

위 내용은 nodejs의 어떤 모듈이 파일 작업 API를 제공합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.