文件操作
相关模块
Node内核提供了很多与文件操作相关的模块,每个模块都提供了一些最基本的操作API,在NPM中也有社区提供的功能包
fs:
基础的文件操作 API
path:
提供和路径相关的操作 API
readline:
用于读取大文本文件,一行一行读
fs-extra(第三方):
https://www.npmjs.com/package/fs-extra
同步或异步调用
- fs模块对文件的几乎所有操作都有同步和异步两种形式
- 例如:readFile() 和 readFileSync()
- 区别:
- 同步调用会阻塞代码的执行,异步则不会
- 异步调用会将读取任务下达到任务队列,直到任务执行完成才会回调
- 异常处理方面,同步必须使用 try catch 方式,异步可以通过回调函数的第一个参数
路径模块
在文件操作的过程中,都必须使用物理路径(绝对路径),path模块提供了一系列与路径相关的 API
console.log('join用于拼接多个路径部分,并转化为正常格式'); const temp = path.join(__dirname, '..', 'lyrics', './友谊之光.lrc'); console.log(temp);console.log('获取路径中的文件名'); console.log(path.basename(temp));console.log('获取路径中的文件名并排除扩展名'); console.log(path.basename(temp, '.lrc'));console.log('====================================');console.log('获取不同操作系统的路径分隔符'); console.log(process.platform + '的分隔符为 ' + path.delimiter);console.log('一般用于分割环境变量'); console.log(process.env.PATH.split(path.delimiter));console.log('====================================');console.log('获取一个路径中的目录部分'); console.log(path.dirname(temp));console.log('====================================');console.log('获取一个路径中最后的扩展名'); console.log(path.extname(temp));console.log('====================================');console.log('将一个路径解析成一个对象的形式'); const pathObject = path.parse(temp); console.log(pathObject);console.log('====================================');console.log('将一个路径对象再转换为一个字符串的形式'); // pathObject.name = '我终于失去了你';pathObject.base = '我终于失去了你.lrc'; console.log(pathObject);console.log(path.format(pathObject));console.log('====================================');console.log('获取一个路径是不是绝对路径'); console.log(path.isAbsolute(temp)); console.log(path.isAbsolute('../lyrics/爱的代价.lrc'));console.log('====================================');console.log('将一个路径转换为当前系统默认的标准格式,并解析其中的./和../'); console.log(path.normalize('c:/develop/demo\\hello/../world/./a.txt'));console.log('====================================');console.log('获取第二个路径相对第一个路径的相对路径'); console.log(path.relative(__dirname, temp));console.log('====================================');console.log('以类似命令行cd命令的方式拼接路径'); console.log(path.resolve(temp, 'c:/', './develop', '../application'));console.log('====================================');console.log('获取不同平台中路径的分隔符(默认)'); console.log(path.sep);console.log('====================================');console.log('允许在任意平台下以WIN32的方法调用PATH对象'); // console.log(path.win32);console.log(path === path.win32);console.log('====================================');console.log('允许在任意平台下以POSIX的方法调用PATH对象'); console.log(path === path.posix);
源码地址: https://github.com/nodejs/node/blob/master/lib/path.js
文件读取
Node中文件读取的方式主要有:
fs.readFile(file[, options], callback(error, data))
fs.readFile('c:\\demo\1.txt', 'utf8', (err, data) => { if (err) throw err; console.log(data);});
fs.readFileSync(file[, options])
try { const data = fs.readFileSync('c:\\demo\1.txt', 'utf8'); console.log(data);} catch(e) { // 文件不存在,或者权限错误 throw e;}
fs.createReadStream(path[, options])
const stream = fs.createReadStream('c:\\demo\1.txt'); let data = '' stream.on('data', (trunk) => { data += trunk;});stream.on('end', () => { console.log(data);});
由于Windows平台下默认文件编码是GBK,在Node中不支持,可以通过 iconv-lite解决
Readline模块逐行读取文本内容
const readline = require('readline'); const fs = require('fs');const rl = readline.createInterface({ input: fs.createReadStream('sample.txt')});rl.on('line', (line) => { console.log('Line from file:', line);});
文件写入
Node中文件写入的方式主要有:
fs.writeFile(file, data[, options], callback(error))
fs.writeFile('c:\\demo\a.txt', new Date(), (error) => { console.log(error);});
fs.writeFileSync(file, data[, options])
try { fs.writeFileSync('c:\\demo\a.txt', new Date());} catch (error) { // 文件夹不存在,或者权限错误 console.log(error);}
fs.createWriteStream(path[,option])
var streamWriter = fs.createWriteStream('c:\\demo\a.txt'); setInterval(() => { streamWriter.write(`${new Date}\n`, (error) => { console.log(error); });}, 1000);
文件写入
fs.appendFile(file,data[,options],callback(err))
// 相比较之前文件流的方式,这种方式不会占用文件资源,append完成就会释放setInterval(() => { fs.appendFile('c:\\demo\a.txt',`${new Date}\n`, (error) => { console.log(error); });}, 1000);
fs.appendFileSync(file,data[,options])
setInterval(() => { fs.appendFileSync('c:\\demo\a.txt',`${new Date}\n`);}, 1000);
其他常见文件操作
验证路径是否存在(过时的API)
- fs.exists(path,callback(exists))
- fs.existsSync(path) // => 返回布尔类型 exists
获取文件信息
- fs.stat(path,callback(err,stats))
- fs.statSync(path) // => 返回一个fs.Stats实例
移动文件或重命名文件或目录
与命令行相同,重命名操作也可以实现文件移动
- fs.rename(oldPath,newPath,callback)
- fs.renameSync(oldPath,newPath)
删除文件
- fs.unlink(path,callback(err))
- fs.unlinkSync(path)
其他常见文件夹操作
创建一个目录
- fs.mkdir(path[,model],callback)
- fs.mkdirSync(path[,model])
删除一个空目录
- fs.rmdir(path,callback)
- fs.rmdirSync(path)
读取一个目录
- fs.readdir(path,callback(err,files))
- fs.readdirSync(path) // => 返回files
文件监视
利用文件监视实现自动 markdown 文件转换
-
相关链接:
- https://github.com/chjj/marked
- https://github.com/Browsersync/browser-sync
-
实现思路:
- 利用 fs模块的文件监视功能监视指定MD文件
- 当文件发生变化后,借助 marked包提供的 markdownto html功能将改变后的MD文件转换为HTML
- 再将得到的HTML替换到模版中
- 最后利用BrowserSync模块实现浏览器自动刷新
const fs = require('fs'); const path = require('path'); var marked = require('marked'); var bs = require('browser-sync').create();var target = path.join(__dirname, process.argv[2] || './README.md'); var filename = path.basename(target, path.extname(target)) + '.html'; var targetHtml = path.join(path.dirname(target), filename);bs.init({ server: path.dirname(target), index: filename, notify: false});bs.reload(filename);var template = `<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title></title> <style>{{{styles}}}</style></head> <body> <article class="markdown"> {{{body}}} </article></body> </html> `;fs.readFile(path.join(__dirname, './markdown.css'), 'utf8', (error, css) => { if (error) throw error; template = template.replace('{{{styles}}}', css); var handler = (current, previous) => { fs.readFile(target, 'utf8', (error, content) => { var html = template.replace('{{{body}}}', marked(content)); fs.writeFile(targetHtml, html, (error) => { if (!error) { console.log(`updated@${new Date()}`); bs.reload(filename); } }); }); }; handler(); fs.watchFile(target, { interval: 100 }, handler);});
缓冲区处理
什么是缓冲区
- 缓冲区就是内存中操作数据的容器
- 只是数据容器而已
- 通过缓冲区可以很方便的操作二进制数据
- 而且在大文件操作时必须有缓冲区
为什么要有缓冲区
- JavaScript是比较擅长处理字符串,但是早期的应用场景主要用于处理HTML文档,不会有太大篇幅的数据处理,也不会接触到二进制的数据。
- 而在Node中操作数据、网络通信是没办法完全以字符串的方式操作的,简单来说
- 所以在Node中引入了一个二进制的缓冲区的实现:Buffer

HTML、CSS和JavaScript在Web开发中的作用分别是:1.HTML定义网页结构,2.CSS控制网页样式,3.JavaScript添加动态行为。它们共同构建了现代网站的框架、美观和交互性。

HTML的未来充满了无限可能。1)新功能和标准将包括更多的语义化标签和WebComponents的普及。2)网页设计趋势将继续向响应式和无障碍设计发展。3)性能优化将通过响应式图片加载和延迟加载技术提升用户体验。

HTML、CSS和JavaScript在网页开发中的角色分别是:HTML负责内容结构,CSS负责样式,JavaScript负责动态行为。1.HTML通过标签定义网页结构和内容,确保语义化。2.CSS通过选择器和属性控制网页样式,使其美观易读。3.JavaScript通过脚本控制网页行为,实现动态和交互功能。

HTMLISNOTAPROGRAMMENGUAGE; ITISAMARKUMARKUPLAGUAGE.1)htmlStructures andFormatSwebContentusingtags.2)itworkswithcsssforstylingandjavascript for Interactivity,增强WebevebDevelopment。

HTML是构建网页结构的基石。1.HTML定义内容结构和语义,使用、、等标签。2.提供语义化标记,如、、等,提升SEO效果。3.通过标签实现用户交互,需注意表单验证。4.使用、等高级元素结合JavaScript实现动态效果。5.常见错误包括标签未闭合和属性值未加引号,需使用验证工具。6.优化策略包括减少HTTP请求、压缩HTML、使用语义化标签等。

HTML是一种用于构建网页的语言,通过标签和属性定义网页结构和内容。1)HTML通过标签组织文档结构,如、。2)浏览器解析HTML构建DOM并渲染网页。3)HTML5的新特性如、、增强了多媒体功能。4)常见错误包括标签未闭合和属性值未加引号。5)优化建议包括使用语义化标签和减少文件大小。

WebDevelovermentReliesonHtml,CSS和JavaScript:1)HTMLStructuresContent,2)CSSStyleSIT和3)JavaScriptAddSstractivity,形成thebasisofmodernWebemodernWebExexperiences。

HTML的作用是通过标签和属性定义网页的结构和内容。1.HTML通过到、等标签组织内容,使其易于阅读和理解。2.使用语义化标签如、等增强可访问性和SEO。3.优化HTML代码可以提高网页加载速度和用户体验。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

VSCode Windows 64位 下载
微软推出的免费、功能强大的一款IDE编辑器

螳螂BT
Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

ZendStudio 13.5.1 Mac
功能强大的PHP集成开发环境

Dreamweaver Mac版
视觉化网页开发工具

MinGW - 适用于 Windows 的极简 GNU
这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。