每天学点node系列-fs文件系统(续)
理想如果不向现实做一点点屈服,那么理想也将归于尘土。
创建目录
异步创建目录
path<string> | <Buffer> | <URL>
options <Object> | <integer>
- recursive <boolean> 默认值: false。
- mode <integer> Windows 上不支持。默认值: 0o777。
callback <Function>
- err <Error></Error>
// fs.mkdir(path[, mode], callback)
var fs = require('fs')
fs.mkdir('sub', function(err){
if(err) throw err
console.log('创建目录成功')
})
执行结果:
$ node 1.js
创建目录成功
同步创建目录
path<string> | <Buffer> | <URL>
- options <Object> | <integer>
- recursive <boolean> 默认值: false。
mode <integer> Windows 上不支持。默认值: 0o777。
// fs.mkdirSync(path[, mode])
var fs = require('fs')
try{
fs.mkdirSync('rock')
console.log('创建目录成功')
}catch(e){
throw e
}
执行结果:
$ node 1.js
创建目录成功
读取目录
异步读取目录
path<string> | <Buffer> | <URL>
options <string> | <Object>
- encoding <string> 默认值: 'utf8'。
- withFileTypes <boolean> 默认值: false。
callback <Function>
- err <Error>
- files <string[]> | <Buffer[]> | <fs.Dirent[]></Error>
注意: files 是目录中的文件名的数组(不包括 '.' 和 '..')
let fs = require('fs')
fs.readdir('./sub', 'utf8', (err, files) => {
if (err) console.log(err)
console.log(files)
})
执行结果:
$ node 1.js
[ '1.css', 'index.html' ]
同步读取目录
path <string> | <Buffer> | <URL>
options <string> | <Object>
- encoding <string> 默认值: 'utf8'。设置为 'buffer',则返回的文件名是 Buffer 对象。
- withFileTypes <boolean> 默认值: false。 设置为 true,则返回的结果将包含 fs.Dirent 对象。
返回: <string[]> | <Buffer[]> | <fs.Dirent[]></boolean>
let fs = require('fs')
try {
let result = fs.readdirSync('./sub', 'utf8')
console.log(result)
} catch (error) {
console.log(error)
}
执行结果:
$ node 1.js
[ '1.css', 'index.html' ]
遍历目录
var fs = require('fs')
var path = require('path')
var getFilesInDir = function (dir) {
var results = [path.resolve(dir)]
var files = fs.readdirSync(dir, 'utf8')
files.forEach(function (file) {
file = path.resolve(dir, file)
var stats = fs.statSync(file)
if (stats.isFile()) {
results.push(file)
} else if (stats.isDirectory()) {
results = results.concat(getFilesInDir(file))
}
})
return results
}
var files = getFilesInDir('./api');
console.log(files);
注意:fs.readdirSync()只会读一层,所以需要判断文件类型是否目录,如果是,则进行递归遍历。
执行结果:
$ node 1.js
[ 'C:\\Users\\Administrator\\Desktop\\api',
'C:\\Users\\Administrator\\Desktop\\api\\config.1.json',
'C:\\Users\\Administrator\\Desktop\\api\\config.json',
'C:\\Users\\Administrator\\Desktop\\api\\config16.json',
'C:\\Users\\Administrator\\Desktop\\api\\integral-consumpte'
...
修改权限
path <string> | <Buffer> | <URL>
mode <integer>
callback <Function>
- err <Error>
var fs = require('fs')
fs.chmod('1.txt', '777', function (err) {
if (err) {
console.log(err)
} else {
console.log("change done")
}
})
同步修改所有者
path <string> | <Buffer> | <URL>
mode <integer>
var fs = require('fs')
fs.chmodSync('./1.txt', '777')
访问/权限检测
path<string> | <Buffer> | <URL>
mode <integer> 默认值: fs.constants.F_OK。
callback <Function>
- err <Error></Error>
const fs = require('fs')
const file = '1.txt';
// 检查当前目录中是否存在该文件。
fs.access(file, fs.constants.F_OK, (err) => {
console.log(`${file} ${err ? '不存在' : '存在'}`);
});
// 检查文件是否可读。
fs.access(file, fs.constants.R_OK, (err) => {
console.log(`${file} ${err ? '不可读' : '可读'}`);
});
// 检查文件是否可写。
fs.access(file, fs.constants.W_OK, (err) => {
console.log(`${file} ${err ? '不可写' : '可写'}`);
});
// 检查当前目录中是否存在该文件,以及该文件是否可写。
fs.access(file, fs.constants.F_OK | fs.constants.W_OK, (err) => {
if (err) {
console.error(
`${file} ${err.code === 'ENOENT' ? '不存在' : '只可读'}`);
} else {
console.log(`${file} 存在,且它是可写的`);
}
});
执行结果:
$ node 1.js
1.txt 存在
1.txt 可读
1.txt 可写
1.txt 存在,且它是可写的
不建议在调用 fs.open()、 fs.readFile() 或 fs.writeFile() 之前使用 fs.access() 检查文件的可访问性。 这样做会引入竞态条件,因为其他进程可能会在两个调用之间更改文件的状态。 相反,应该直接打开、读取或写入文件,如果文件无法访问则处理引发的错误。
写入(不推荐)
const fs = require('fs')
const file = '1.txt'
fs.access(file, (err) => {
if (!err) {
console.error(`${file} 已存在`)
return
}
fs.open(file, 'wx', (err, fd) => {
if (err) throw err
writeMyData(fd)
})
})
写入(推荐)
const fs = require('fs')
fs.open('1.txt', 'wx', (err, fd) => {
if (err) {
if (err.code === 'EEXIST') {
console.error('1.txt 已存在')
return
}
throw err
}
writeMyData(fd)
})
同步访问/权限检测
path<string> | <Buffer> | <URL>
mode <integer> 默认值: fs.constants.F_OK。
注意: 如果可访问性检查失败,则抛出 Error。 否则,该方法将返回 undefined。
try {
fs.accessSync('./1.txt', fs.constants.R_OK | fs.constants.W_OK)
console.log('可以读写')
} catch (err) {
console.error('无权访问')
}
删除目录
异步删除目录
path<string> | <Buffer> | <URL>
callback <Function>
- err <Error>
注意:在文件(而不是目录)上使用 fs.rmdir() 会导致在 Windows 上出现 ENOENT 错误、在 POSIX 上出现 ENOTDIR 错误。
var fs = require('fs')
fs.rmdir('./rock', function(err){
if(err) throw err
console.log('目录删除成功')
})
同步删除目录
path <string> | <Buffer> | <URL>
var fs = require('fs')
fs.rmdirSync('./rock')
实用场景
文件锁
使用独占标记创建锁文件
fs模块为所有需要打开文件的方法提供了一个x标记。这告诉操作系统这个文件应该以独占模式打开(O_EXCL)。当使用这个方法时,若这个文件存在,文件不能被打开。
文件数据库
策略是不断的追加记录,在处理的时候不断的覆盖原始记录。
var fs = require('fs')
var EventEmitter = require('events').EventEmitter
var Database = function (path) {
this.path = path
// 数据库key/value映射表
this._records = Object.create(null)
this._writeStream = fs.createWriteStream(this.path, {
encoding: 'utf8',
flags: 'a'
})
this._load()
}
// 继承自EventEmitter,让它有可以监听事件、传递事件的功能
Database.prototype = Object.create(EventEmitter.prototype)
Database.prototype._load = function () {
var stream = fs.createReadStream(this.path, { encoding: 'utf8' })
var database = this
var data = ''
// 当输入流准备好时触发
stream.on('readable', function () {
data += stream.read()
// 每一行是一组数据
var records = data.split('\n')
data = records.pop()
for (var i = 0; i < records.length; i++) {
try {
var record = JSON.parse(records[i])
if (record.value == null) {
delete database._records[record.key]
} else {
database._records[record.key] = record.value
}
} catch (e) {
database.emit('error', 'found invalid record:', records[i])
}
}
})
// 流处理完后发送load事件给消费者
stream.on('end', function () {
database.emit('load')
})
}
let database = new Database('./sub/a.txt')
database._writeStream.write('beep')
每天学点node系列-fs文件系统(续)的更多相关文章
- 每天学点node系列-fs文件系统
好的代码像粥一样,都是用时间熬出来的. 概述 文件 I/O 是由简单封装的标准 POSIX 函数提供的. 通过 require('fs') 使用该模块. 所有文件系统操作都具有同步和异步的形式. 异步 ...
- Node.js fs文件系统模块
一.读取文件几个步骤 1.先引入fs文件系统模块 2.使用readfile 或 readFileSync 注意点:它们的回调函数有两个参数,第一个是err,第二个是data,得到的data是buffe ...
- 每天学点node系列-stream
在编写代码时,我们应该有一些方法将程序像连接水管一样连接起来 -- 当我们需要获取一些数据时,可以去通过"拧"其他的部分来达到目的.这也应该是IO应有的方式. -- Doug Mc ...
- 每天学点node系列-http
任何可以使用JavaScript来编写的应用,最终会由JavaScript编写.--Atwood's Law http模块概览 http模块主要用于创建http server服务,并且 支持更多特性 ...
- 每天学点node系列-zlib
永不放弃,永不放弃又有两个原则,第一个原则是永不放弃,第二个原则就是:当你想放弃时回头看第一个原则. 概览 做过web性能优化的同学,对性能优化大杀器gzip应该不陌生.浏览器向服务器发起资源请求,比 ...
- Node.js:fs文件系统模块
fs文件系统模块,这是一个非常重要的模块,对文件的操作都基于它.该模块的所有方法都有同步和异步两种方式,下面便介绍一下该模块的使用. 1.检测当前进程对文件的权限 使用fs.access(path[, ...
- node.js中fs文件系统模块的使用
node.js中为我们提供了fs文件系统模块,实现对文件或目录的创建,修改和删除等操作. fs模块中,所有的方法分为同步和异步两种实现. 有 sync 后缀的方法为同步方法,没有 sync 后缀的方法 ...
- node.js常用的fs文件系统
fs文件系统模块对于系统文件及目录进行一些读写操作. 模块中的方法均有异步和同步版本,例如读取文件内容的函数有异步的 fs.readFile() 和同步的 fs.readFileSync(). 异步的 ...
- node.js中常用的fs文件系统
fs文件系统模块对于系统文件及目录进行一些读写操作. 模块中的方法均有异步和同步版本,例如读取文件内容的函数有异步的 fs.readFile() 和同步的 fs.readFileSync(). 异步的 ...
随机推荐
- STL 中间< 超载
相同的代码,mingw能够执行,vs不能执行. vs报告错误: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY2h1Y2h1cw==/font/5a6L5 ...
- oracle_set运营商
oracle_set运营商 ①UNION/UNION ALL UNION 运算符返回的结果集,并设置两个查询.对于这两组重复部分的.重复数据删除 例: select id,name from t ...
- sql 1=1
大多数时候是为了sql拼写方便而加的条件从执行任务来看,不影响性能
- JAVASCRIPT高程笔记-------第十章 DOM对象
10.1.1 node类型 --除IE外 所有浏览器都可以访问到这个类型 :JS中所有的节点类型都继承自Node类型 nodeName 与nodeValue 如果是一个元素 那么nodeName中保 ...
- java.text.MessageFormat 专题
java.text.MessageFormat类MessageFormat提供一种语言无关的方式来组装消息,它允许你在运行时刻用指定的参数来替换掉消息字符串中的一部分.你可以为MessageForma ...
- 【wpf】在win10系统上弹出toast和notification
原文:[wpf]在win10系统上弹出toast和notification 老规矩,先看效果 右下角的notification: 操作中心的notification: 整体效果: 前提条件 1.需要在 ...
- delphi 获取大于2G的物理内存大小
一般情况下,我们是用GlobalMemoryStatus 来获取物理内存大小的 但该API在物理内存大小超过2G的时候,返回值均为2GB.因此,没有办法获取真实的物理内存大小,所以需要对此进行改进. ...
- QList, QLinkedList, QVector, QStack, QQueue的区别,以前也没见过QCache,而且可以自定义cost
http://doc.qt.io/qt-4.8/containers.html http://doc.qt.io/qt-4.8/qcache.html
- SQL Server 中心订阅模型(多发布单订阅)
原文:SQL Server 中心订阅模型(多发布单订阅) 大多数SQL Server 复制拓扑都是基于中心发布模型,它是由一个发布复制到一个或者多个订阅.另一个复制模型是中心订阅模型,它使用事务复制由 ...
- windows-qt 使用mingw编译c++boost并使用
一.boost是一个准标准库,相当于STL的延续和扩充,它的设计理念和STL比较接近,都是利用泛型让复用达到最大化.不过对比STL,boost更加实用.STL集中在算法部分,而boost包含了不少工具 ...