目录
文件操作
相关模块
同步或异步调用
路径模块
文件读取
fs.readFile(file[, options], callback(error, data))
fs.readFileSync(file[, options])
fs.createReadStream(path[, options])
Readline模块逐行读取文本内容
文件写入
fs.writeFile(file, data[, options], callback(error))
fs.writeFileSync(file, data[, options])
fs.createWriteStream(path[,option])
fs.appendFile(file,data[,options],callback(err))
fs.appendFileSync(file,data[,options])
其他常见文件操作
验证路径是否存在(过时的API)
获取文件信息
移动文件或重命名文件或目录
删除文件
其他常见文件夹操作
创建一个目录
删除一个空目录
读取一个目录
文件监视
利用文件监视实现自动 markdown 文件转换
缓冲区处理
什么是缓冲区
为什么要有缓冲区
首页 web前端 html教程 Node基础篇(文件操作)_html/css_WEB-ITnose

Node基础篇(文件操作)_html/css_WEB-ITnose

Jun 21, 2016 am 08:55 AM

文件操作

相关模块

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 文件转换

  • 相关链接:

    1. https://github.com/chjj/marked
    2. https://github.com/Browsersync/browser-sync
  • 实现思路:

    1. 利用 fs模块的文件监视功能监视指定MD文件
    2. 当文件发生变化后,借助 marked包提供的 markdownto html功能将改变后的MD文件转换为HTML
    3. 再将得到的HTML替换到模版中
    4. 最后利用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
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

<🎜>:泡泡胶模拟器无穷大 - 如何获取和使用皇家钥匙
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系统,解释
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆树的耳语 - 如何解锁抓钩
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

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

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

热门话题

Java教程
1670
14
CakePHP 教程
1428
52
Laravel 教程
1329
25
PHP教程
1274
29
C# 教程
1256
24
HTML:结构,CSS:样式,JavaScript:行为 HTML:结构,CSS:样式,JavaScript:行为 Apr 18, 2025 am 12:09 AM

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

HTML,CSS和JavaScript的未来:网络开发趋势 HTML,CSS和JavaScript的未来:网络开发趋势 Apr 19, 2025 am 12:02 AM

HTML的未来趋势是语义化和Web组件,CSS的未来趋势是CSS-in-JS和CSSHoudini,JavaScript的未来趋势是WebAssembly和Serverless。1.HTML的语义化提高可访问性和SEO效果,Web组件提升开发效率但需注意浏览器兼容性。2.CSS-in-JS增强样式管理灵活性但可能增大文件体积,CSSHoudini允许直接操作CSS渲染。3.WebAssembly优化浏览器应用性能但学习曲线陡,Serverless简化开发但需优化冷启动问题。

HTML的未来:网络设计的发展和趋势 HTML的未来:网络设计的发展和趋势 Apr 17, 2025 am 12:12 AM

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

HTML:建立网页的结构 HTML:建立网页的结构 Apr 14, 2025 am 12:14 AM

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

HTML与CSS vs. JavaScript:比较概述 HTML与CSS vs. JavaScript:比较概述 Apr 16, 2025 am 12:04 AM

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

HTML与CSS和JavaScript:比较Web技术 HTML与CSS和JavaScript:比较Web技术 Apr 23, 2025 am 12:05 AM

HTML、CSS和JavaScript是构建现代网页的核心技术:1.HTML定义网页结构,2.CSS负责网页外观,3.JavaScript提供网页动态和交互性,它们共同作用,打造出用户体验良好的网站。

HTML:是编程语言还是其他? HTML:是编程语言还是其他? Apr 15, 2025 am 12:13 AM

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

&lt; strong&gt;,lt; b&gt;有什么区别标签和lt; em&gt;,&lt; i&gt;标签? &lt; strong&gt;,lt; b&gt;有什么区别标签和lt; em&gt;,&lt; i&gt;标签? Apr 28, 2025 pm 05:42 PM

本文讨论了HTML标签,和和关注其语义与表现用途及其对SEO和可访问性的影响之间的差异。

See all articles