对于Nodejs学习笔记文件模块

首先,开放分析

文件系统模块是一个简单的包装标准POSIX文件我 / O的操作方法,你可以通过调用需要的模块(FS)。所有的文件系统模块的方法有异步和同步版本。

(1)文件系统模块中的异步方法需要一个完整的回调函数作为最后传入参数。

(2)回调函数的组成是由调用调用的异步方法决定的。一般来说,回调函数的第一个参数是返回的错误消息。

(3)如果异步操作正确地执行并返回,则错误是null或未定义的。如果使用同步版本的操作,则错误将以通常抛出错误的形式返回。

(4)您可以使用尝试和catch语句来拦截错误并使程序继续运行。

让我们看一个简单的例子,阅读文件(:

(1)、设置文档的bb.txt,以下内容(大家,我是大雄君!(* ^ __ ^ *)嘻嘻…)…

(2)读取文件的操作如下:

复制代码代码如下所示:

var =要求(FS );

fs.readfile(BB .txt

如果(错误)抛出错误;

console.log(数据);

});



运行结果:



这里需要注意的是:读取文件必须设置代码,否则默认是缓冲区的形式。

看一下运行效果,不要再设置了,差别很明显:



另一个写操作如下:

复制代码代码如下所示:

var =要求(FS );

VaR txt =每个人都应该学习nodejs!!!;

写入文件

fs.writefile(BB .txt

如果(错误)抛出错误;

console.log(文件保存!);

});



运行结果:



在一些常见例子的列表中:

复制代码代码如下所示:

删除文件

Fs.unlink('bb .txt功能(){(){

console.log(''成功');

});

修改文件名。

Fs.rename('bb .txt,'bigbear .txt功能(ERR){)

console.log('rename成功);

});

查看文件状态

fs.stat('bb .txt功能(呃,STAT){

console.log(STAT);

});

/ /找到

fs.exists('bb .txt功能(存在){

console.log(存在);

});



二、Fs与河流的联系

流具有异步的特点。我可以读一个文件或一段内容到一个未知的大小的块来读,每读到一个块我们将输出他。直到文件结束。这就像传输编码:分块通过支持HTTP1.1。(块可以以任何形式存在和NodeJS的形式是缓冲流在NodeJS对UNIX系统的超级功能(管-----管)。

记得第一次Nodejs HTTP模块程序,你好,大熊!你呢我们根据那个小程序做了更改,下面的代码:

(1)建立bb.html

复制代码代码如下所示:







{ div

边距:50px;

宽度:100%;

保证金:0px;

身高:120px;

行高:120px;

颜色:# FFF;

字体大小:22px;

背景:# ff9900;

文本对齐:中心;

}







你好,大熊!







(2)修改前的程序如下:

复制代码代码如下所示:

var http =需要('http');

var =要求(FS );

VaR服务器= http.createserver(功能(REQ,RES){

fs.readfile(BB。HTML

如果(错误){

res.writehead(500,{ 'context-type:中/平原});

res.end('specify文件不存在!或服务器错误!);

}

别的{

res.writehead(200,{ 'context-type:中/的HTML});

res.write(数据);

res.end();

}

})

});

(8888)server.listen;

console.log(HTTP服务器运行在8888端口上…);



以下是手术的结果:



现在我们需要想一想,如果我们想要发送一个文本文件,而不是一个简单的文本文件,例如,2014的IO conference.mp4眉目传情全高清格式的视频文件。长度超过1080P的2小时。

大约4 GB,称读文件的工作方式是读取文件到内存。所以很明显,这么大的文件不能这样做,我应该做什么然后你需要使用流来做它,这就是它的方式。

代码如下:

复制代码代码如下所示:

fs.createreadstream(__dirname + /视频。MP4的)Pipe(RES);



总结:

这些代码可以执行所需的功能,但是服务需要在发送文件数据之前将整个文件数据缓存到内存中,如果文件非常好。

大量的并发会浪费大量的内存,因为用户需要等到整个文件缓存到内存才能接受文件数据,这会导致什么原因呢

用户体验较差,但它的好,(REQ,RES)两参数均流,所以我们可以使用fs.createreadstream()而不是fs.readfile()。

三,一个例子

文件上传的小栗子:

(1)建立server.js

复制代码代码如下所示:

var http =需要('http');

var url =需要('url);

函数开始(路由,处理程序){

功能要求(请求、响应){

VaR的路径= url.parse(请求URL)。Pathname;

对应业务逻辑的路由

路径(路径、处理、响应、请求);

}

http.createserver(要求)听(3000);

console.log('server开始);

}

exports.start =开始;



(2)建立route.js

复制代码代码如下所示:

功能路径(路径、处理、响应、请求){

console.log(路由请求+路径);

如果(typeof处理{ } = { 'function路径)

退货处理{路径}(响应请求);

{ { { }

console.log(不请求处理程序发现+路径);

response.writehead(404,{ 'content-type:中/的HTML});

response.write('404没有发现!;

response.end();

}

}

exports.route =路线;



(3)建立requesthandler.js

复制代码代码如下所示:

VaR的=需要('querystring),

FS =需要('fs),

强大的=需要(强大的);

函数启动(响应,请求){

console.log(起始模块);

var

+

<元http-equiv =+内容类型

内容=文本/ HTML;字符集= UTF-8 /+

+

+

+

+

+

+

+

';

response.writehead(200,{ 'content-type:中/的HTML});

response.write(身体);

response.end();

}

函数上载(响应,请求){

console.log('upload模块);

VaR形式=新formidable.incomingform();

form.parse(要求功能(错误、字段、文件){

Fs.renameSync(文件上传。路径,/tmp /测试。png);

response.writehead(200,{ 'content-type:中/的HTML});

response.write(你已经发出:);

response.write(' ');

response.end();

});

}

函数显示(响应,请求){

console.log('show模块);

Fs.readFile( / /测试TMP。png,'binary功能(错误,文件){

如果(错误){

response.writehead(200,{ 'content-type:中/的HTML});

response.write(错误);

response.end();

{人}

response.writehead(200,{ 'content-type ':'图像/ PNG的});

response.write(文件,'binary);

response.end();

}

});

}

exports.start =开始;

exports.upload =上传;

导出=显示;



(4)建立index.js

复制代码代码如下所示:

var(=服务器);

var路由器=需要({路由器});

VaR的请求处理程序=需要('。 /请求处理程序);

var强大=需要(强大的); / /要求的路径搜索算法

var处理程序{ };

处理 /} = { requesthandler.start;

处理{ /启动} = requesthandler.start;

处理{ /上传} = requesthandler.upload;

处理 /展示} { = requesthandler.show;

Server.start(router.route,处理程序);



四,总结

(1)理解Fs与河流的联系。

(2)熟练使用FS相关API。

(3)注意对细节的控制,例如API同步模式和文件操作异步模式之间的处理细节。

(4)最后强调了:在文件上传示例中,要理解代码组织方式,不断地重构和总结。