当前位置: 首页 > 后端技术 > Node.js

前端实训-中级阶段(47)-Node.js10.x文件模块

时间:2023-04-03 17:29:44 Node.js

最基础的前端就是HTML+CSS+Javascript。掌握这三项技术算是入门,但也只是入门而已。现在前端开发的定义远不止于此。前端小课堂(HTML/CSS/JS),本着提高技术水平,夯实基础知识的中心思想,开课(每周四)。使用Node.js的很大一部分使用场景是编写一个小脚本来批处理重复枯燥的任务。比如:获取所有的json内容,然后过滤出想要的数据。将所有图片压缩后放入压缩包中。提取并压缩字体文件。重命名所有文件。在这些任务中,我们都需要访问文件系统。在浏览器环境中,以前没有文件系统的概念。今天就来学习一下吧。Node.js文件模块我们可以使用fs来操作文件系统。constfs=require('fs');callbackmethod所有的文件系统操作都是同步的(10.x有,history也有),callback(10.x有,history也有),promise-based(12.x开始有,history没有)。同步形式的同步会阻止Node.js事件循环和进一步的JavaScript执行,直到操作完成。异常会立即抛出,可以用try...catch或冒泡处理。constfs=require('fs');尝试{fs.unlinkSync('file');console.log('文件已成功删除');}catch(err){//处理错误}asynchronous异步形式total是将完成回调作为最后一个参数。传递给完成回调的参数取决于具体的方法,但第一个参数总是为异常保留的。如果操作成功完成,第一个参数将为null或未定义。constfs=require('fs');fs.unlink('file',(err)=>{if(err)throwerr;console.log('文件删除成功');});promise基于Promise操作返回一个Promise(在异步操作完成时被解析)。constfs=require('fs/promises');(asyncfunction(path){try{awaitfs.unlink(path);console.log(`成功删除文件${path}`);}catch(错误){console.error('error:',error.message);}})('文件');文件路径支持string(使用Path库即可),Buffer(为了兼容),URL(需要newURL('file:///C:/')作为入参。可以使用相对路径(process.cwd()可以查看当前路径),绝对路径.字符串形式在Windows上,Node.js遵循独立驱动器工作目录的概念。当使用不带反斜杠的驱动器路径时可以观察到这种行为。例如,fs.readdirSync('C:\\')可能返回的结果与fs.readdirSync('C:')不同,详见thisMSDNpage一般我们使用Path库:直接看最终地址即可使用当前系统的路径分隔符正确。Unix系统是“/”,Windows系统是“”。URL形式//在Windows上://-带有主机名的WHATWG文件的URL被转换为UNC路径。//file://hostname/file=>hostnamefilefs.readFileSync(newURL('file://hostname/file'));//-带有驱动器号的WHATWG文件的URL被转换为绝对路径。//file:///C:/file=>C:filefs.readFileSync(newURL('file:///C:/file'));APIdirectorydirClassfs.readdirSync()同步获取目录fs.readdir()异步获取目录当调用fs.readdir()或fs.readdirSync()时(withFileTypes选项设置为true),则结果数组填充fs.Dirent对象(而不是字符串或缓冲区)。fs.mkdir(path[,options],callback)异步创建一个目录。回调传递一个可能的异常,以及创建的第一个目录的路径(如果递归为真),(错误,[路径])。可选的选项参数可以是一个整数(指定模式(权限和粘性位)),或者一个对象(具有模式属性和递归属性(指示是否创建父目录))。当path是现有目录时,调用fs.mkdir()只会在recursive为false时导致错误。fs.mkdirSync(path[,options])同步创建目录。返回未定义的,或者如果recursive为真则返回创建的第一个目录的路径。这是fs.mkdir()的同步版本。watchfs.FSWatcher类fs.watch()每当修改指定的监视文件时,都会触发'change'事件。//使用fs.watch()侦听器的示例。fs.watch('./tmp',{encoding:'buffer'},(eventType,filename)=>{if(filename){console.log(filename);}});使用fs.ReadStream类读取流由fs.createReadStream()函数创建并返回的fs.ReadStream实例。fs.createReadStream(path[,options])path<字符串>|<缓冲区>|选项<字符串>|flags请参阅文件系统标志支持。默认值:'r'。编码默认值:null。fd<整数>默认值:空。模式<整数>默认值:0o666。autoClose默认值:true。emitClose默认值:false。startend默认值:无穷大。highWaterMark<整数>默认值:64*1024。默认值:null。返回:查看可读流。写入流fs.WriteStream类使用fs.createWriteStream()函数创建并返回fs.WriteStream实例。fs.createWriteStream(path[,options])路径|<缓冲区>|选项<字符串>|flags请参阅文件系统标志支持。默认值:'w'。编码默认值:'utf8'。fd<整数>默认值:空。模式<整数>默认值:0o666。autoClose默认值:true。emitClose默认值:false。开始<整数>fs<对象>|默认值:null。返回:查看可写流。,.文件信息fs.Stats类的fs.Stats对象提供了关于文件的信息。遍历的时候会判断文件类型,如果是文件就打开,如果是目录就从fs.stat(),fs.lstat(),fs.fstat()递归返回对象,以及它们的同步方法。这个类型。如果传递给这些方法的选项中的bigint为真,则该值将是bigint而不是数字,并且该对象将包含具有纳秒级精度的附加属性(以Ns为后缀)。stats.isDirectory()如果fs.Stats对象描述了文件系统目录,则返回true。stats.isFile()如果fs.Stats对象描述的是普通文件,则返回true。stats.size文件的大小(以字节为单位)。stats.mtime指示上次修改此文件的时间戳。stats.mtimeMs指示此文件的最后修改时间戳,以自POSIX纪元以来的毫秒数表示。stats.birthtime表示此文件创建时间的时间戳。stats.birthtimeMs指示此文件创建时间的时间戳,以自POSIX纪元以来的毫秒数表示。文件属性的时间值#中英文对照atimeMs、mtimeMs、ctimeMs、birthtimeMs属性是数值,保存的是对应的时间(单位是毫秒)。它们的精度取决于平台。当将bigint:true传递给生成对象的方法时,属性将是bigint类型,否则它们将是Number类型。atimeNs、mtimeNs、ctimeNs和birthtimeNs属性是bigints,以纳秒为单位保存相应的时间。只有当bigint:true传递给生成对象的方法时,它们才会出现。它们的精度取决于平台。atime、mtime、ctime、birthtime是时间对应的Date对象。日期值与数值没有关联。分配新值或更改Date的值不会影响相应的属性。stat对象中的时间具有以下语义:atime“访问时间”——文件数据最后一次被访问的时间。由mknod(2)、utimes(2)和read(2)系统调用更改。mtime"modifiedtime"-最后一次修改文件数据的时间。由mknod(2)、utimes(2)和write(2)系统调用更改。ctime"changetime"-最后一次文件状态改变的时间(inode数据的修改)。由chmod(2)、chown(2)、link(2)、mknod(2)、rename(2)、unlink(2)、utimes(2)、read(2)和write(2)系统调用更改.birthtime"creationtime"-文件的创建时间。创建文件时设置一次。在不支持创建时间的文件系统上,该字段可能会保存ctime或1970-01-01T00:00Z(即Unix纪元时间戳0)。在这种情况下,该值可能大于atime或mtime。在Darwin和其他FreeBSD衍生产品上,也可以使用utimes(2)系统调用将atime显式设置为比birthtime更早的值。在Node.js0.12之前,ctime在Windows系统上保存出生时间。从0.12开始,ctime不再是“创建时间”,在Unix系统上也从来不是。获取权限访问fs.access,fs.accessSync除了判断权限,还可以判断是否存在。但是,我们一般可以直接用fs.open()直接处理err。一般来说,文件可访问性只在文件不被直接使用时才检查,例如当它的可访问性是来自另一个进程的信号时。在Windows上,目录的访问控制策略(ACL)可能会限制对文件或目录的访问。但是,fs.access()函数不检查ACL,因此即使ACL限制用户读取或写入,路径也可能被报告为可访问。fs.access(path[,mode],callback)path<字符串>|<缓冲区>|mode默认值:fs.constants.F_OK。callbackerr测试用户对路径指定的文件或目录的权限。mode参数是一个可选的整数,指定要执行的可访问性检查。有关模式的可选值,请参阅文件可访问性常量。可以创建由两个或多个值的按位或组成的掩码(例如fs.constants.W_OK|fs.constants.R_OK)。Filefs.open(path[,flags[,mode]],callback)异步打开文件。fs.openSync(path[,flags,mode])同步打开文件fs.read(fd,buffer,offset,length,position,callback)从fd指定的文件中读取数据写入buffer。fs.readSync(fd,buffer,offset,length,position)同步版本,从指定的fs读取数据fs.readFile(path[,options],callback)异步读取文件的全部内容。fs.readFileSync(path[,options])同步版本,读取文件的全部内容fs.appendFile(path,data[,options],callback)异步追加数据到文件,如果文件不存在则创建文件.数据可以是字符串或缓冲区。fs.appendFileSync(path,data[,options])将数据同步附加到文件,如果文件不存在则创建文件。数据可以是字符串或缓冲区。//直接追加到文件中fs.appendFileSync('file.txt','appendeddata','utf8');//先打开文件,然后将fd追加到文件中descriptor=fs.openSync('file.txt','A');fs.appendFileSync(fd,'附加数据','utf8');fs.copyFile(src,dest[,mode],callback)异步复制src到dest。默认情况下,如果dest已经存在,它将被覆盖。回调函数除了可能的异常外不接受任何参数。Node.js不保证复制操作的原子性。如果打开目标文件进行写入后发生错误,Node.js将尝试删除目标文件。fs.copyFileSync(src,dest[,mode])同步fs.rename(oldPath,newPath,callback)将oldPath处的文件异步重命名为newPath提供的路径名。如果newPath已经存在,它将被覆盖。完成回调除了可能的异常之外不接受任何参数。fs.renameSync(oldPath,newPath)同步版本,文件重命名fs.write(fd,buffer[,offset[,length[,position]]],callback)将buffer写入fd指定的文件。在不等待回调的情况下对同一个文件多次使用fs.write()是不安全的。对于这种情况,建议使用fs.createWriteStream()。示例获取目录下的所有图片并上传到服务器constFormData=require('form-data');constfetch=require('node-fetch');varfs=require('fs');varpath=require('path');vardirPath='cdn-transform'varfilePath=path.resolve(`./node-upload-img/${dirPath}`);//文件遍历方法functionfileDisplay(filePath){fs.readdir(filePath,function(err,files){if(err){console.warn(err)}else{files.forEach(function(filename){varfiledir=path.join(filePath,filename);varbuffer=fs.readFileSync(filedir)varformData=newFormData();varfileName=`${filename}`varurl=`www.lilnong.top/upload/fe-up/${dirPath}/${fileName}`;formData.append('file',buffer,`${fileName}`);fetch('http://www.lilnong.top/upload',{headers:formData.getHeaders(),method:'post',body:表单数据}).then(v=>v.text()).then(v=>{console.log('http://www.lilnong.top/upload',url,v)})})}});}fileDisplay(filePath)递归遍历所有jsonconstreadDir=(entry,paths=[])=>{constdirInfo=fs.readdirSync(entry);dirInfo.forEach(item=>{constlocation=path.join(entry,item);constinfo=fs.statSync(location);if(info.isDirectory()){console.log(`dir:${location}`);readDir(location,[item]);}else{if(/.json$/.test(location)){readFile(location,paths)}}})}console.log('__dirname',__dirname)readDir(__dirname);functionreadFile(path,pathKey){returnconsole.log(path,pathKey);})微信公众号:前端立农参考前端培训目录,前端培训规划,前端训练计划http://nodejs.cn/api/fs.html#fs_file_paths