从零学习node.js之文件操作(三)

// server.js var fs = require('fs'); fs.readFile('./data.txt', 'utf-8', function(err, data){ if(err) throw err; console.log(data); });

读取图片时,我们是不能直接输出到控制台中的,是需要创建一个服务器,然后在浏览器上进行查看。其实在上节中,我们已经了解过显示图片的过程了。

// server.js var http = require('http'), fs = require('fs'); http.createServer(function(request, response){ // 使用二进制方式读取图片 fs.readFile('./img/test.png', 'binary', function(err, file){ if( err ) throw err; // 当前数据以image/png方式进行输出 response.writeHead(200, {"Content-Type": "image/png"}); response.write(file, 'binary'); response.end(); }); }).listen(3000); console.log('server has started...');

打开浏览器:127.0.0.1:3000,就能看到图片了。

1.2 写入文件

将字符串写入到文件文件中,是非常简单的操作,使用writeFile即可搞定:

var fs = require('fs'); var data = '从一开始,就选择了做前端开发,因为觉得前端开发更贴近用户,能够倾听用户的声音,更好玩,更有意思,美的更直观。我们总是在尝试最新的技术,尝试更炫的效果,希望更能优化用户的体验效果!'; fs.writeFile('./test.txt', data, function(err){ if(err) throw err; console.log('写入数据成功...'); });

writeFile方法,在没有文件时会创建文件并写入;若文件存在则内容被覆盖。

1.3 创建或文件重命名

根据writeFile的特性,可以使用writeFile写入空字符串的方式创建文件。

同时,fs.open也可以创建文件:

// 打开模式可以使用 w | w+ | a | a+ // 这些模式在打开不存在的文件时,会创建文件 // fd为一个整数,表示打开文件返回的文件描述符,window中又称文件句柄 fs.open(Date.now()+'.txt', 'a+', function(err, fd){ if(err) throw err; console.log(fd); })

在文件系统中,有一个fs.rename的方法,顾名思义,对文件(文件夹)进行重命名。

fs.rename(oldname, newname, callback(err));

特性:

将oldname文件(目录)移动至newname的路径下,并重新命名;如果oldname和newname是同一个路径,则直接进行重命名。

二、文件夹操作

通常对目录的操作比较简单一些。

2.1 读取文件夹中的文件和文件夹列表

使用fs.readdir(path, callback)可以获取path路径下的文件和目录列表,而且只能读取直接目录下的文件和文件夹,子目录里的是获取不到的。

fs.readdir('./', function(err, files){ if(err) throw err; console.log( files ); });

输出结果:

[ 'img', 'msg.txt', 'node_modules', 'package.json', 'server.js', 'test.js', 'tmp' ]

node_modules和tmp是文件夹,剩下的是文件,而且是获取不到node_modules和tmp里面的数据。获取一个目录下所有的文件,后面会讲解,稍等。

2.2 删除文件夹

使用fs.rmdir(path, callback)可以删除文件夹,但只能删除空文件夹,如果当前路径不是文件夹或当前文件夹不为空,则删除失败;删除的为空文件夹时,可以删除成功。

fs.rmdir('./tmp', function(err){ if(err){ console.log('删除文件夹失败'); throw err; }else{ console.log('删除成功'); } })

如何删除不为空的目录,后面会讲解,稍等。

2.3 获取文件或文件夹的信息

fs.stat(path, callback)能够获取path路径的信息,比如创建时间,修改时间,文件大小,当前是否为文件,当前是否为文件夹等信息;如果path路径不存在,则抛出异常。

fs.stat('./test.js', function(err, stats){ if( err ){ console.log( '路径错误' ); throw err; } console.log(stats); console.log( 'isfile: '+stats.isFile() ); // 是否为文件 console.log( 'isdir: '+stats.isDirectory() ); // 是否为文件夹 });

结果:

{ dev: -29606086, mode: 33206, nlink: 1, uid: 0, gid: 0, rdev: 0, blksize: undefined, ino: 2251799813687343, size: 2063, // path路径为文件夹时,size为0 blocks: undefined, atime: Thu Jan 12 2017 21:12:36 GMT+0800 (中国标准时间), mtime: Sat Jan 14 2017 21:57:26 GMT+0800 (中国标准时间), ctime: Sat Jan 14 2017 21:57:26 GMT+0800 (中国标准时间), birthtime: Thu Jan 12 2017 21:12:36 GMT+0800 (中国标准时间) } isfile: true // 是否为文件 isdir: false // 是否为文件夹

关于这几个时间属性的理解,可以参考这篇文章

stats中的size属性就是当前文件的大小(单位:字节,除以1024即为kb),stats还有下面方法可供使用:

stats.isFile()

stats.isDirectory()

stats.isBlockDevice()

stats.isCharacterDevice()

stats.isSymbolicLink() (only valid with fs.lstat())

stats.isFIFO()

stats.isSocket()

fs.stat(path, callback)是异步执行的,对应的还有同步执行版本:fs.statSync(path) ,这个方法返回的就是fs.stats实例。

三、综合运用

我们在上面的讲解中,还留着两个功能没实现,这里实现一下它的过程。

3.1 遍历目录中所有的文件

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wwzsgy.html