【10bet】nodejs模块——fs模块

来源:http://www.chinese-glasses.com 作者:Web前端 人气:148 发布时间:2020-03-24
摘要:时间: 2019-11-02阅读: 147标签: 模块http模块 fs模块用于对系统文件及目录进行读写操作。 response对象常用方法: 一、同步和异步 使用require('fs')载入fs模块,模块中所有方法都有同步和异步

时间: 2019-11-02阅读: 147标签: 模块http模块

fs模块用于对系统文件及目录进行读写操作。

response对象常用方法:

一、同步和异步

使用require('fs')载入fs模块,模块中所有方法都有同步和异步两种形式。

异步方法中回调函数的第一个参数总是留给异常参数(exception),如果方法成功完成,该参数为null或undefined。

异步写法demo:有一个回调函数。

var fs = require('fs'); // 载入fs模块

fs.unlink('/tmp/shiyanlou', function(err) {
    if (err) {
        throw err;
    }
    console.log('成功删除了 /tmp/shiyanlou');
});

同步写法demo:

var fs = require('fs');

fs.unlinkSync('/tmp/shiyanlou'); // Sync 表示是同步方法
console.log('成功删除了 /tmp/shiyanlou');

同步方法执行完并返回结果后,才能执行后续的代码。而异步方法采用回调函数接收返回结果,可以立即执行后续代码。

response.writeHead(200,{'Content-Type':'text/plain:charset=UTF-8'});

二、readFile读取文件

fs.readFile(filename,[option],callback) 方法读取文件。

参数说明:

  • filename String 文件名
  • option Object
    • encoding String |null default=null
    • flag String default='r'
  • callback Function

此方法只能在消息上调用一次,并且必须在调用response.end()之前调用。

demo

有一个文本文件text.txt内容如下

line one
line two

和text.txt相同目录中有一个readfile.js,内容如下

readFile的回调函数接收两个参数,err是读取文件出错时触发的错误对象,data是从文件读取的数据。

var fs = require('fs'); // 引入fs模块

fs.readFile('./test.txt', function(err, data) {
    // 读取文件失败/错误
    if (err) {
        throw err;
    }
    // 读取文件成功
    console.log(data);
});

$ node readfile.js运行结果

<Buffer 6c 69 6e 65 20 6f 6e 65 0a 6c 69 6e 65 20 74 77 6f 0a>

这是原始二进制数据在缓冲区中的内容。

要显示文件内容可以使用toString()或者设置输出编码。

toString()写法:

// 使用toString()
fs.readFile('./test.txt', function(err, data) {
    // 读取文件失败/错误
    if (err) {
        throw err;
    }
    // 读取文件成功
    console.log(data.toString());
});

设置utf-8编码写法:

// 设置编码格式
fs.readFile('./test.txt', 'utf-8', function(err, data) {
    // 读取文件失败/错误
    if (err) {
        throw err;
    }
    // 读取文件成功
    console.log('utf-8: ', data.toString());
  //直接用console.log(data);也可以
});

readFile同步的写法就是没有回调函数:fs.readFileSync(filename,[options])。

response.write()发送一块相应主体,用来给客户端发送相应数据。write可以使用多次,但是最后一定要使用end来结束响应,否则客户端会一直等待。response.end()此方法向服务器发出信号,表示已发送所有响应头和主体,该服务器应该视为此消息完成。必须在每个响应上调用方法response.end()。

三、WriteFile写入文件

使用fs.writeFile(filename,data,[options],callback)写入内容到文件。

参数说明:

  • filename String 文件名
  • data String|buffer
  • option Object
    • encoding String |null**default='utf-8'**
    • mode Number default=438(aka 0666 in Octal)
    • flag String**default='w'**
  • callback Function

const http = require('http');(function(req, res) { res.writeHead(200, {'Content-Type': 'text/html'}); res.write('hello world'); res.write('h1hello node.js/h1'); res.end();}).listen(8080);console.log('Server running at ');

demo

var fs = require('fs'); // 引入fs模块

// 写入文件内容(如果文件不存在会创建一个文件)
// 写入时会先清空文件
fs.writeFile('./test2.txt', 'test test', function(err) {
    if (err) {
        throw err;
    }

    console.log('Saved.');

    // 写入成功后读取测试
    fs.readFile('./test2.txt', 'utf-8', function(err, data) {
        if (err) {
            throw err;
        }
        console.log(data);
    });
});

因为默认flag='w'是写,会清空文件,想要追加,可以传递一个flag参数,如下。

var fs = require('fs'); // 引入fs模块

// 写入文件内容(如果文件不存在会创建一个文件)
// 传递了追加参数 { 'flag': 'a' }
fs.writeFile('./test2.txt', 'test test', { 'flag': 'a' }, function(err) {
    if (err) {
        throw err;
    }

    console.log('Saved.');

    // 写入成功后读取测试
    fs.readFile('./test2.txt', 'utf-8', function(err, data) {
        if (err) {
            throw err;
        }
        console.log(data);
    });
});

flag传值,r代表读取文件,w代表写文件,a代表追加。

request对象

四、使用fs.read和fs.write读写文件

fs.read和fs.write功能类似fs.readFile和fs.writeFile(),但提供更底层的操作,实际应用中多用fs.readFile和fs.writeFile。

使用fs.read和fs.write读写文件需要使用fs.open打开文件和fs.close关闭文件。

request.url获取请求路径,获取到的是端口号之后的那一部分路径,也就是说所有的url都是以/开头的,判断路径处理响应。request.socket.localAddress获取ip地址。request.socket.remotePort获取源端口。

1、fs.read()

const http = require('http');let server = ();server.on('request', function(req, res) { console.log('收到请求,请求路径是:' + req.url); console.log('请求我的客户端的地址是:', req.socket.remoteAddress, req.socket.remotePort); let url = req.url; res.writeHead(200, {'Content-Type': 'text/html;charset=UTF-8'}); switch (url) { case '/': res.end('h1Index page/h1'); break; case '/login': res.end('h1Login page/h1'); break; default: res.end('404 Not Found.'); break; }});server.listen(8080, function() { console.log('服务器启动成功,可以访问了。。。');});

先介绍fs.open。

fs.open(path,flags,[mode],callback)方法用于打开文件,以便fs.read()读取。

参数说明:

  • path 文件路径
  • flags打开文件的方式
  • [mode] 是文件的权限(可行参数,默认值是0666)
  • callback 回调函数

flags值及说明如下

r :读取文件,文件不存在时报错;
r+ :读取并写入文件,文件不存在时报错;
rs :以同步方式读取文件,文件不存在时报错;
rs+ :以同步方式读取并写入文件,文件不存在时报错;
w :写入文件,文件不存在则创建,存在则清空;
wx :和w一样,但是文件存在时会报错;
w+ :读取并写入文件,文件不存在则创建,存在则清空;
wx+ :和w+一样,但是文件存在时会报错;
a :以追加方式写入文件,文件不存在则创建;
ax :和a一样,但是文件存在时会报错;
a+ :读取并追加写入文件,文件不存在则创建;
ax+ :和a+一样,但是文件存在时会报错。

fs模块

fs.close(fd,[callback])

用于关闭文件,fd是所打开文件的文件描述符。

fs.read(fd,buffer,offset,length,position,callback)接收6个参数。

参数说明:

  • fd 文件描述符,必须接收fs.open()方法中的回调函数返回的第二个参数。
  • buffer 是存放读取到的数据的Buffer对象。
  • offset 指定 向buffer中存放数据的起始位置
  • length 指定 读取文件中数据的字节数
  • position 指定 在文件中读取文件内容的起始位置
  • callback 回调函数,参数如下
    • err 用于抛出异常
    • bytesRead 从文件中读取内容的实际字节数
    • buffer 被读取的缓存区对象。

demo: read.js内容如下

var fs = require('fs'); // 引入fs模块

// 打开文件
fs.open('./testread.txt', 'r', function(err, fd) {
    if (err) {
        throw err;
    }
    console.log('open file success.');
    var buffer = new Buffer(255);
    // 读取文件
    fs.read(fd, buffer, 0, 10, 0, function(err, bytesRead, buffer) {
        if (err) {
            throw err;
        }
        // 打印出buffer中存入的数据
        console.log(bytesRead, buffer.slice(0, bytesRead).toString());

        // 关闭文件
        fs.close(fd);
    });
});

运行结果

10bet 1 

所有文件系统操作都具有同步和异步的形式。异步方法中回调的第一个参数总是留给异常参数,如果方法成功完成,那么这个参数为null或undefined。

2、fs.write()

fs.read(fd,buffer,offset,length[,position],callback(err,bytesWritten,buffer))接收6个参数。

参数说明:

  • fd 文件描述符,必须接收fs.open()方法中的回调函数返回的第二个参数。
  • buffer 是存放 将被写入的数据,buffer尺寸的大小设置最好是8的倍数,效率较高。
  • offset  buffer写入的偏移量
  • length (integer)指定 写入文件中数据的字节数
  • position (integer) 指定 在写入文件内容的起始位置
  • callback 回调函数,参数如下

    • err 用于抛出异常
    • bytesWritten从文件中读取内容的实际字节数
    • buffer 被读取的缓存区对象。

    var fs = require('fs'); // 引入fs模块

    // 打开文件 fs.open('./testwrite.txt', w, function(err, fd) {

    if (err) {
        throw err;
    }
    console.log('open file success.');
    var buffer = new Buffer('shiyanlou');
    // 读取文件
    fs.write(fd, buffer, 0, 6, 0, function(err, bytesWritten, buffer) {
        if (err) {
            throw err;
        }
    
        console.log('write success.');
        // 打印出buffer中存入的数据
        console.log(bytesWritten, buffer.slice(0, bytesWritten).toString());
    
        // 关闭文件
        fs.close(fd);
    });
    

    });

运行结果如下:

 10bet 2

因为Node.js是单线程的,所以在Node.js中绝大部分需要在服务器运行期反复执行业务逻辑的代码,必须使用异步代码,否则,同步代码在执行期,服务器将停止响应。

五、目录操作

服务器启动时如果需要读取配置文件,或结束时需要写入到状态文件时,可以使用同步代码,因为这些代码只在启动和结束时执行一次,不影响服务器正常运行时的异步执行。

1、创建目录

使用fs.mkdir(path,[mode],callback)创建目录,path是需要创建的目录,[mode]是目录的权限(默认是0777),callback是回调函数。

demo:mkdir.js内容如下

var fs = require('fs'); // 引入fs模块

// 创建 newdir 目录
fs.mkdir('./newdir', function(err) {
    if (err) {
        throw err;
    }
    console.log('make dir success.');
});

删除目录可以用fs.rmdir(path,callback);但是只能删除空目录。

打开文件

2、读取目录

使用fs.readdir(path,callback)读取文件目录。

demo:readdir.js内容如下

var fs = require('fs'); // 引入fs模块

fs.readdir('./newdir', function(err, files) {
    if (err) {
        throw err;
    }
    // files是一个数组
    // 每个元素是此目录下的文件或文件夹的名称
    console.log(files);
});

结果输出该目录有哪些目录和文件。

10bet 3

 

本文作者10bet,starof,因知识本身在变化,作者也在不断学习成长,文章内容也不定时更新,为避免误导读者,方便追根溯源,请诸位转载注明出处:http://www.cnblogs.com/starof/p/5038300.html有问题欢迎与我讨论,共同进步。

异步打开文件语法格式:fs.open(path,flags[mode],callback);

参数说明:

path:文件路径。flags:文件打开的行为。mode:设置文件模式(权限),文件创建默认权限为0o666(可读写)。callback:回调函数,带有两个参数:callback(err,fd)。

flags参数:

a- 打开文件用于追加。如果文件不存在,则创建该文件。ax- 与a相似,但如果路径存在则失败。a+- 打开文件用于读取和追加。如果文件不存在,则创建该文件。ax+- 与a+相似,但如果路径存在则失败。as- 以同步模式打开文件用于追加。如果文件不存在,则创建该文件。as+- 以同步模式打开文件用于读取和追加。如果文件不存在,则创建该文件。r- 打开文件用于读取。如果文件不存在,则会发生异常。r+- 打开文件用于读取和写入。如果文件不存在,则会发生异常。rs+- 以同步模式打开文件用于读取和写入。指示操作系统绕开本地文件系统缓存。这对于在NFS挂载上打开文件非常有用,因为它允许跳过可能过时的本地缓存。 它对I/O性能有非常实际的影响,因此除非需要,否则不建议使用此标志。这不会将fs.open()或fsPromises.open()转换为同步的阻塞调用。 如果需要同步操作,则应使用fs.openSync()之类的操作。w- 打开文件用于写入。创建文件(如果它不存在)或截断文件(如果存在)。wx- 与w相似,但如果路径存在则失败。w+- 打开文件用于读取和写入。创建文件(如果它不存在)或截断文件(如果存在)。wx+- 与w+相似,但如果路径存在则失败。

const fs = require('fs');fs.open('file/syl.txt', 'r+', function(err, fd) { if (err) { return console.error(err); } console.log('文件打开成功!');});

关闭文件

异步打开文件语法格式:fs.close(fs,callback);

const fs = require('fs');fs.open('file/syl.txt', 'r+', function(err, fd) { if (err) { return console.error(err); } console.log('文件打开成功!'); fs.close(fd, function(err) { if (err) { console.log(err); } console.log('文件关闭成功'); });});

使用fs.read和fs.write读写文件

使用fs.read和fs.write读写文件需要使用fs.open打开文件和fs.close关闭文件。

使用fs.read读取文件

异步读取文件的语法格式:fs.read(fs,buffer,offset,length,position,callback)

参数:

fd:通过fs.open()方法返回的文件描述符。buffer:数据写入的缓冲区。offset:缓冲区中开始写入的偏移量。length:一个整数,指定要读取的字节数。position:指定从文件中开始读取的位置。如果position为null,则从当前文件位置读取数据,并更新文件位置。callback:回调函数,有三个参数err、bytesRead、buffer。

const fs = require('fs');fs.open('file/syl.txt', 'r+', function(err, fd) { if (err) { return console.error(err); } console.log('文件打开成功!'); console.log('准备读取文件:'); // 创建一个大小为1024字节的缓存区 let buf = Buffer.alloc(1024); // 异步读取文件 fs.read(fd, buf, 0, buf.length, 0, function(err, bytes, buf) { if (err) { console.log(err); } console.log(bytes + '字节被读取'); if (bytes  0) { console.log(buf.slice(0, bytes).toString()); } fs.close(fd, function(err) { if (err) { console.log(err); } console.log('文件关闭成功'); }); });});// 文件打开成功!// 准备读取文件:// 5字节被读取// Hello// 文件关闭成功

使用fs.write写入文件

异步写入文件的语法格式:fs.write(fd,buffer,offset,length,position,callback);

const fs = require('fs');fs.open('file/syl.txt', 'a', function(err, fd) { if (err) { return console.error(err); } console.log('文件打开成功!'); console.log('准备写入文件:'); let buf = Buffer.from(new String('Hello World')); fs.write(fd, buf, 0, 11, 0, function(err, bytes, buf) { if (err) { console.log(err); } console.log('写入成功'); console.log(bytes + '字节被写入'); console.log(buf.slice(0, bytes).toString()); fs.close(fd, function(err) { if (err) { console.log(err); } console.log('文件关闭成功'); }); });});// 文件打开成功!// 准备写入文件:// 写入成功// 11字节被写入// Hello World// 文件关闭成功

另外一种语法:fs.write(fd,string,position,encoding,callback);

const fs = require('fs');fs.open('file/syl.txt', 'a', function(err, fd) { if (err) { return console.error(err); } console.log('文件打开成功!'); console.log('准备写入文件:'); let data = ',Hello Node.js'; fs.write(fd, data, 0, 'utf-8', function(err, bytes, buffer) { if (err) { console.log(err); } console.log(bytes + '字节被写入'); console.log(buffer); fs.close(fd, function(err) { if (err) { console.log(err); } console.log('文件关闭成功'); }); });});// 文件打开成功!// 准备写入文件:// 14字节被写入// ,Hello Node.js// 文件关闭成功

fs.read和fs.write需要结合fs.open得到文件句柄来使用。

readFile读取文件

本文由10bet发布于Web前端,转载请注明出处:【10bet】nodejs模块——fs模块

关键词:

频道精选

最火资讯