欢迎关注我的博客我在马路边

适用人群

本文适用于刚接触Node的小白,毕竟我也是小白,大佬请绕行。

Node文件操作

在实际开发中遇到很多有关文件及文件夹的操作,比如创建、删除文件及文件夹,文件拷贝、压缩和生产word等。用到文件系统、流操作以及相关依赖等,封装了一些常用的方法可供重复使用。

常用API

具体API参考:Node.js中文网(点击前往),API对各种方法的使用介绍已经很详细,下面不过多介绍,主要写一些开发中遇到的问题以及重构方法。

在操作过程中一般会遇到同步和异步操作,一般方法以Sync结尾均为同步操作,异步一般通过回调函数或者监听来实现同步效果。

fs文件系统

文件操作是很常见的方式,下面简述同步和异步操作的方法,文件流操作需要通过管道通信来监听,具体事件可参考:监听事件

// 引用文件系统
const fs = require('fs');
// 文件操作最长遇到的问题:同步、异步操作
// 文件读取异步操作
fs.readFile('/etc/passwd', (err, data) => { // 回调函数
if (err) throw err;
console.log(data);
});
// 文件读取同步操作
fs.readFileSync('<directory>');
// 文件流操作
fs.createReadStream('sample.txt', { encoding: 'utf-8'});
fs.createWriteStream('sample.txt'), { close: false }).on('close', function(){
// 监听close事件实现文件流传输同步操作
...
})
// 通过文件流将文件从A拷贝到B
fs.createReadStream('/A/sample.txt', { encoding: 'utf-8'}).pipe(fs.createWriteStream('/B/sample.txt'), { close: false }).on('close', function () {
// 监听close事件实现文件流传输同步操作
...
});

officegen Office插件

导出word依赖officegen包,git地址。详细介绍了各种API的使用方式,当然这里也是异步的。

// 引入officegen
const officegen = require('officegen'); // 创建 ppt 2007 :
var pptx = officegen ( 'pptx' );
// 创建 Word 2007 :
var docx = officegen ( 'docx' );
// 创建 Excel 2007 :
var xlsx = officegen ( 'xlsx' );
// 以创建ppt为例
pptx.setDocTitle ( '<title>' );
var out = fs.createWriteStream ( 'out.pptx' ); // 流输出创建文件
pptx.generate ( out );
out.on ( 'close', function () {
console.log ( 'Finished to create the PPTX file!' ); // 回调执行接下步骤达到同步操作
});

封装重用方法

封装了删除、创建文件夹及文件的方法,以及重复生成word文件方法。

文件操作

采用递归创建不重复名称的文件夹,filePath为文件夹路径,num为初始状态0


/**
* 创建文件夹
* @param {*} filePath
* @param {*} num
*/
function mkDifDir(filePath, num) {
var newFilePath = filePath;
while (fs.existsSync(newFilePath) && fs.statSync(newFilePath).isDirectory()) {
num++;
newFilePath = filePath + '(' + num + ')'
}
fs.mkdirSync(newFilePath);
return newFilePath;
} // 调用方式
mkDifDir('D://abc', 0);
// 返回结果
// 如果目标目录存在abc文件夹,则创建abc(1)文件夹,返回D://abc(1),否则直接创建abc文件夹
// 如果还存在abc(1)文件夹,则依次类推直到不重复创建出abc(n)文件夹位置并返回值

根据传入多及目录递归创建文件夹

/**
* 创建多层目录文件
* @param {*} dirname
*/
function mkdirsSync(dirname) {
if (fs.existsSync(dirname)) {
return true;
} else {
if (mkdirsSync(path.dirname(dirname))) {
fs.mkdirSync(dirname);
return true;
}
}
}
// 调用方式
mkdirsSync('D://a//b//c//d//e//f');
// 返回结果
// 会在D盘下依次生成a==>b==>c==>d==>e==>f文件结构的文件夹
// 如果存在D://a//b//c//d则会在d下创建e==>f文件结构的文件夹

上述方法的进阶版,也是调用上述方法,再嵌套一层,可以直接一句目录创建出文件夹及文件

/**
* 创建文件包含文件夹目录
* @param {*} filePath
*/
function createFile(filePath) {
var dirPath = path.dirname(filePath);
mkdirsSync(dirPath);
if (!fs.existsSync(filePath)) {
fs.writeFileSync(filePath, '', { // 创建文件
encoding: 'utf-8'
})
}
}
// 调用方式
mkdirsSync('D://a//b//c//d//e//f//abc.txt');
// 返回结果
// 会在D盘下依次生成a==>b==>c==>d==>e==>f文件结构的文件夹,并在f文件夹下创建acb.txt
// 如果存在D://a//b//c//d则会在d下创建e==>f文件结构的文件夹,并在f文件夹下创建acb.txt

根据目录删除文件夹下的所有文件及文件夹下的内容,同样也是递归操作

/**
* 删除url下所有的内容
* @param {*} url
*/
function deleteAllFiles(url) {
var files = [];
files = fs.readdirSync(url);
if (files.length == 0) {
fs.rmdirSync(url);
}
files.forEach(function (file, index) {
// var curPath = url + "/" + file;
var curPath = path.join(url, file);
//fs.statSync同步读取文件夹文件,如果是文件夹,在重复触发函数
if (fs.statSync(curPath).isDirectory()) { // recurse
deleteAllFiles(curPath);
// 是文件delete file
} else {
fs.unlinkSync(curPath);
}
});
// 清除文件夹
fs.rmdirSync(url);
}
// 调用方式
// 存在目录
// D--a--b--c--d--e--f--abc.txt
// |--h--r--n--abc.txt
// |--i--t--m--abc.txt
// |--j--y--k--abc.txt
// |--k--y--l--abc.txt
mkdirsSync('D://a//b//c');
// 结果只剩下D://a//b//c文件夹,内部内容全部清除。

office操作

其实上述API已经写了怎么调用和实现,并且连接内的API更加清楚,但是我们使用时常常会生成很多word每次都要重复写,所以封装了一个回调方法用来生成word,其他的可根据具体内容进行扩展。实现如下:

/**
* 导入数据并生成word。
* @param {导入的数据} data
* @param {导出路径} outPath
* @param {回到函数} callback
*/
function exportWord(data, outPath, callback) {
var docx = officegen('docx');
var pObj = docx.createP();
pObj.addText(data);
var out = fs.createWriteStream(outPath, { close: false }); // 文件写入
out.on('error', function (err) {
logger.info("exportWord error ! outPath : " + outPath, err);
});
docx.generate(out);
out.on('close', function () {
logger.info("exportWord success ! outPath : " + outPath);
callback('callback');
});
} // 这样就不用写重复方法了,调用方式如下
exportWord('balabalabala...', 'abc.docx', function () { // 导出word文件abc.docx,word内容balabalabala...
exportWord('balabalabala...', 'qwe.docx', function () { // 导出word文件qwe.docx,word内容balabalabala...
exportWord('balabalabala...', '123.docx', function () { // 导出word文件123.docx,word内容balabalabala...
// 回调中继续其他操作
...
});
});
});

总结

上述内容只是常用的内容一部分,对于小白的我来说经常忘记,所以在此记录,互相学习,互相帮助。开发过程中还有其他形形色色的问题,后期再更新。

欢迎关注我的博客我在马路边

Nodejs文件相关操作的更多相关文章

  1. Git基本命令 -- 基本工作流程 + 文件相关操作

    可以先找一个已经被git管理的项目, 我就使用这个项目吧: https://github.com/solenovex/ID3-Editor 基本工作流程 克隆以后呢, 进入该目录查看一下状态: 然后添 ...

  2. python文件相关操作

    Python文件相关操作 打开文件 打开文件,采用open方法,会将文件的句柄返回,如下: f = open('test_file.txt','r',encoding='utf-8') 在上面的代码中 ...

  3. VC++文件相关操作的函数封装实现

    在开发编译工具中,需要用到文件的相关操作,于是就封装了相关的函数实现: //判断文件是否存在 BOOL FileIsExist(CString strFileName) { CFileFind fin ...

  4. 【原创】Linux基础之gz文件相关操作

    gz文件不需要解压即可进行相关操作 $ zcat test.log.gz $ zmore test.log.gz $ zless test.log.gz $ zgrep '1.2.3.4' test. ...

  5. linux学习笔记一----------文件相关操作

    一.目录结构 二.文件管理操作命令(有关文件夹操作,使用Tab键自动补全文件名(如果多个默认第一个)) 1.ls 查看目录信息:ls -l 查看目录详细信息(等价于ll 某些系统不支持) 2.pwd ...

  6. UWP中的文件相关操作

    最近开始做UWP开发,图省事儿就把自己之前一个Winform项目的一部分代码拷贝到了新写的UWP项目中来.整出了一些幺蛾子,下面做一个记录. 首先提一个重点就是:UWP里关于文件的操作尽量用Stora ...

  7. UNIX高级环境编程(5)Files And Directories - 文件相关时间,目录文件相关操作

     1 File Times 每个文件会维护三个时间字段,每个字段代表的时间都不同.如下表所示: 字段说明: st_mtim(the modification time)记录了文件内容最后一次被修改的时 ...

  8. 关于php的ini文件相关操作函数浅析

    在小公司,特别是创业型公司,整个服务器的搭建一般也是我们 PHP 开发工程师的职责之一.其中,最主要的一项就是要配置好服务器的 php.ini 文件.一些参数会对服务器的性能产生深远的影响,而且也有些 ...

  9. c语言中文件相关操作

    一 .首先介绍一下数据文件的类型: 1.二进制文件(映像文件):在内存中以二进制形式存取. 2.文本文件(ascii文件):以ascii码形式存取的文件. 通俗的讲,在Mac下,你把一个文件丢进记事本 ...

随机推荐

  1. poj 3468 Splay 树

    大二上的时候.写过一个AVL的操作演示,今天一看Splay.发现和AVL事实上一样,加上线段树的基础,懒惰标记什么都知道.学起来轻松很多哦 我參考的模板来自这里  http://blog.csdn.n ...

  2. Java数据结构-线性表之顺序表ArrayList

    线性表的顺序存储结构.也称为顺序表.指用一段连续的存储单元依次存储线性表中的数据元素. 依据顺序表的特性,我们用数组来实现顺序表,以下是我通过数组实现的Java版本号的顺序表. package com ...

  3. DBCP组件概述

    许多Apache的项目都支持与关系型数据库进行交互.为每个用户都创建一个连接是一项非常耗时的工作(通常情况下,需要花费几秒中),而为了执行数据库的事务处理可能还需要花费几毫秒.对于一个对外公开访问的互 ...

  4. Windows 下Node.js开发环境配置

    第一步:安装VirtualBox(以管理员身份安装) 1.安装完成后,打开VirtualBox,点击“新建”按钮,输入信息,“下一步”(名称可任意) 2.设置内存为1024MB,“下一步”—>“ ...

  5. Android jni 编程(参数的传递,成员,方法的)相互访问

    package com.test.androidjni; import android.app.Activity; import android.os.Bundle; import android.u ...

  6. 九度OJ 1260:珍珠项链 (字符串处理、DP)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:101 解决:27 题目描述: 假设有一条珍珠项链,有很多珍珠,r代表红色, b代表蓝色, w代表白色. 假设你在某一处剪开之后,你会沿着顺时 ...

  7. L2 范数 L1 范数 出租车范数

    https://en.wikipedia.org/wiki/Norm_(mathematics) http://cs231n.github.io/classification/

  8. 【python】-- json & pickle、xml、requests、hashlib、shelve、shutil、configparser、subprocess

    json & pickle Python中用于序列化的两个模块 json     用于[字符串]和 [python基本数据类型] 间进行转换 pickle   用于[python特有的类型] ...

  9. (转)Spring 缓存EhCacheFactoryBean

    Spring使用Cache 从3.1开始,Spring引入了对Cache的支持.其使用方法和原理都类似于Spring对事务管理的支持.Spring Cache是作用在方法上的,其核心思想是这样的:当我 ...

  10. J.U.C重入锁

    ReentrantLock重入锁 ReentrantLock是Java并发包中互斥锁,它有公平锁和非公平锁两种实现方式, 重入的意思就是,如果已经获得了锁,如果执行期间还需要获得这个锁的话,会直接获得 ...