Node.js之操作文件系统(二)

Node.js之操作文件系统(二)

1.创建与读取目录

1.1 创建目录

在fs模块中,可以使用mkdir方法创建目录,该方法的使用方法如下:

fs.mkdir(path,[mode],callbcak)
//第一个参数:指定需要被创建的目录的完整路径及目录名,
第二个参数:指定该目录的权限,默认为0777
第三个参数,用于创建目录操作完毕时调用的回调函数,
function(err){ }

在使用同步方法创建目录时,可以使用fs模块中的mkdirSync方法,使用该方法如下:

fs.mkdirSync(path,[mode])

1.2 读取目录

在fs模块中,可以使用readdir方法读取目录:

fs.readdir(path,callback)

//第一个参数:指定被读取的目录的玩或者呢个路径及目录名;

//callbackc参数用于指定读取目录操作完毕时调用的回调函数,该回调函数为:

function(err,files){

//回到函数代码

}

//第一个参数:读取目录操作失败时错发的错误对象

都二个参数为一个数组,其中存放读取到文件中的所有文件名

在使用同步方式创建目录时,可以使用fs模块中的mkdirSync方法:

var files = fs.readdirSync(path)

2. 查看与修改文件或目录的信息

2.1 查看文件或目录信息

在fs模块中,使用stat方法或lstat方法查看一个文件或目录的信息,区别是当查看符号链接文件的信息时,必须使用lstat方法。

fs.stat(path,callback)
fs.lstat(path,callback)
//第一个参数:指定需要被查看文件或目录的完整路径及文件名或目录名
//callback:function(err,stats){
//回调函数代码
}
//第一个参数:查看或目录信息操作失败时触发的错误对象
//stats参数为fs.Stats对象,可取的值为:
isFiled:判断被查看的对象是否为一个文件
isDiretory:判断被查看的对象是否为一个目录
isBlockDevice:判断被查看的文件是否为一个块设备文件
isCharaterDevice:判断被查看的文件是否为一个字符设备文件
isSymbolicLink:判断被查看文件是否为一个符号链接文件
isFIFO:判断被查看文件是否为一个FIFO文件
isSocket:判断被查看文件是否为一个Socket文件
dev:该属性值为文件或目录所在设备ID
ino:该属性为文件或目录的索引引编号
mode:该属性为使用数值形式代表的文件或目录的权限标志
nlink:该属性值为文件或目录的硬件连接数量
uid:该属性值为文件或目录的所有者的用户的ID
gid:该属性值为文件或目录的所有者的组的ID
rdev:该属性值为字符设备文件或块设备文件所在设备ID
size:该属性为文件尺寸
atime:该属性值为文件访问时间
mtime:该属性值为文件的修改时间
ctime:该属性值为文件的创建时间

eg:

  1 var fs = require('fs')
2 fs.stat('./message.txt',function(err,stats){
3 console.log(stats)
4 })

运行结果:

[root@kuber2 webproject]# node app4.js
Stats {
dev: 2050,
mode: 33188,
nlink: 1,
uid: 0,
gid: 0,
rdev: 0,
blksize: 4096,
ino: 807582519,
size: 11,
blocks: 8,
atime: 2017-08-28T09:12:54.690Z,
mtime: 2017-08-28T09:28:32.273Z,
ctime: 2017-08-28T09:28:32.273Z,
birthtime: 2017-08-28T09:28:32.273Z }
[root@kuber2 webproject]#

使用同步方式查看文件信息时,使用fs模块中的statSync方法或者lstatSync方法:

var stats = fs.ststSync(path)
var stats = fs.lstatSync(path)

该方法返回存放了文件信息的fs.Stats

在使用open方法或者openSync方法打来文件或者返回文件描述符后,可以使用fs模块中的fstat方法查看被打开文件的信息,该方法的使用方法如下:

fs.fstat(fd,callback)
//fd:为打开文件时返回的文件描述符
callback:function(err,stats){
//回调函数代码
} 或者
var stats = fs.fstatSync(fd)

2.2 检测文件或者目录是否存在

利用exists方法检查一个文件或者目录是否存在:

fs.exists(path,callback)
//path:指定需要被检测的文件或者目录的完整路径及文件名或目录名
callback:指定检测文件或目录信息操作完毕时执行的回调函数。
function(exists){
//回调函数代码
}
当文件存在时,exists为true 否则为false

在同步方法中为:

var exists = fs.existsSync(path)

2.3. 获取文件或目录的绝对路径

利用realpath方法获得一个文件或者目录的绝对路径

fs.realpath(path,[cashe],callbcak)
//path:指定需要查看的文件或目录的完整路径
cache:存放一些预先指定的路径
callback(err,resolvePath){
//回调函数代码
}
err:指定获取文件或目录失败时触发的错误对象
resolvepath:获取到文件或目录的绝对路径

在同步方式中:

var resolvepath = fs.realpathSync(path,[cache])

2.4 修改文件访问时间及修改时间

使用utimes方法修改文件的访问时间及修改时间:

fs.utimes(path,atime,mtime,callback)
//第一个参数:指定需要被修改时间的文件的完整路径及文件名
第二个参数:指定修改后的访问时间
第三个参数:指定修改后的修改时间
callback:function(err){
//回调函数代码
}

在同步方法中:

fs.utimesSync(path,atime,mwtime)

在使用open或者openSync方法打开文件并返回文件描述符后,可利用futimes方法修改访问时间与修改时间:

fs.fuctimes(fd,atime,mtime,callback)
fs.futimeSync(fd,atime,mtime)

2.5 修改文件后目录的读写权限

利用chmod方法修改文件或目录的读写权限

fs.chmod(path,mode,callback)
//第一个参数:指定需要修改文件的完整路径及文件名
第二个参数:指定修改后文件后目录的读写权限
callback: function(err){
//回调函数代码
}

在同步方式中:

fs.chmodSync(path,mode)

在使用open或者openSync方法打开文件并返回文件描述符时,可以使用fchmod方法修改权限

fs.fchmod(fd,mode,callback)
fs.fchmodSync(fd,mode)

3. 对文件或目录执行的其他操作

3.1 移动文件或目录

在fs模块中,使用rename方法移动文件或目录,

fs.rename(oldPath,newPath,callback)
//第一个参数:指定被移动或目录的完整路径及文件名或目录名
第二个参数:指定移动后该文件或目录的完整路径及文件名或目录名
callback:function(err){
//回调函数代码
}

使用同步方式:

	fs.renameSync(oldPath,newPath)

3.2创建与删除文件的硬连接

所谓的硬连接就是:文件的一个或多个文件名。在fs模块中使用link创建文件的硬连接

fs.link(srcpath,dstpath,callback)
//第一个参数:指定需要被创建硬连接的文件的完整路径及文件名
第二个参数:指定被创建的硬连接的完整路径及文件名,该硬件连接与原文件必须位于同一个卷中
callback:指定被创建硬连接操作完毕时调用的回调函数:function(err){
//回调函数代码
}

在使用同步方式创建文件的硬连接时,可以使用linkSync方法:

fs.linkSync(srcpath,dstpath)

删除硬连接使用unlink方法:

fs.unlink(path,callbcak)
fs.unlinkSync(path,callback)

3.3 创建与查看符号链接

所谓符号链接:是一种特殊文件,这个文件包含了另一个文件或目录的路径及文件名或目录名,如果打开一个文件符号链接文件进行编辑,操作系统将自动打开符号链接中指向的源文件进行编辑,但如果删除符号链接,或删除源文件,两者之间会失去连接关系,但不会删去另一方。

在fs中,使用symlink方法来创建文件或目录的符号链接:

fs.symlink(srcpath,dstpath,[type],callback)
//第一个参数:用于指定需要被创建符号链接的文件或目录的完整路径及文件名或目录名
第二个参数:指定被创建的符号链接的完整路径及文件名
第三个参数:用于指定为文件创建符号链接还是为目录创建符号链接,可定值为file,dir(非Windows中)(junction(windows中))
callback:function(err){
//回调函数代码
}

在同步中,可以使用fs模块中的symlinkSync方法:

fs.symlinkSync(srcpath,dstpath,[type])

在创建了一个符号链接之后,可以使用fs模块中的readlink方法读取符号链接中所包含的另一个文件或目录的路径及文件名及目录名:

fs.readlink(path,callback)
其中callbcak:function(err,linkString){
//回调函数代码略
}
err:读物符号链接操作失败时触发的错误
linkString:一个链接字符串,包含了另有一个文件或目录的路径及文件,名或目录名

在同步方式中:

var linkString = fs.readlinkSync(path)

3.4 截断文件

截断文件:首先清除文件内容,然后修改文件尺寸,使用truncate方法:

fs.truncate(filename,len,callback)
//第一个参数:指定被截断文件的完整路径及文件名
//第二个参数:指定被截断后的文件尺寸
callback:function(err){
//回调函数代码
}

在同步方式中:

fs.truncateSync(filename,len)

在使用openhuoopenSync方法打开文件并返回文件描述符后,可以使用发truncate方法截断文件:

fs.ftruncate(fd,len,callback)
fs.ftruncateSync(fd,len)

3.5 删除空目录

利用rmdir方法删除空目录:

fs.rmdir(path,callback)

//第一个参数:指定需要被删除目录的完整路径及目录名

callback:function(err){

//回调函数代码

}

在同步方式中:

fs.rmdirSync(path)

3.6监视文件或目录

使用watchFile方法对文件进行监视,并且在监视到文件被修改时执行某些处理:

fs.watchFile(filename,[options],listener)
//第一个参数:指定需要被监视的文件的完整路径及文件名
//第二个参数:使用一个布尔型的persistent属性值,来指定当指定了被监视的文件后是否停止当前正在运行的应用程序,默认为true
也可以使用intercal属性值来指定每个多少毫秒监视一次文件是否发生改变及发生了什么改变
listener:function(curr,prev){
//回调函数代码
}
curr:为一个fs.Stats对象,代表被修改后当前文件
prev:为一个fs.Stats对象,代表修改之前对象

eg:

fs.watchFile('./message.txt',{persistent:false},function(curr,prev){
//代码略
}) fs.watchFile('./message.txt',{interval:60*60*1000},function(curr,prev){
//代码略
})

当使用watchFile方法对文件进行监事时,可以使用unwatchFile方法取消当文件发生改变时所要执行的处理

fs.unwatchFile(filename,[lisenter])

另外,在fs模块中使用watch方法对文件或目录进行监视,并在监视时执行某些处理:

var watcher = fs。watch(filename,[options],listener)
listener:function(event,filename){
//回调函数代码
}
event:rename,change,
fileaname:任何发生改变的文件的完整路径及文件名

watch方法返回一个fs.FSWatcher对象,该对象拥有close方法,用于停止对watch方法中指定监视的文件或对象所执行的监视操作。该方法的使用方法如下所示:

watcher.close()

当对使用watch方法指定监视文件或目录进行监视的过程中,出现错误会处罚fsFSWatcher对象的error事件,会产生回调函数:

function(err){
//回调函数代码
}

4. 使用文件流

在一个应用程序中,流是一组有序的,有起点和终点的字节数据的传输手段。在应用程序中各种对象之间交换与传输数据的时候,总是先将该对象中所包含的数据转换为各种形式的流数据,再通过流的传输,到达目的的对象后再将流数据转换为该对象中可以使用的数据

4.1 使用ReadStream对象读取文件

在fs模块中,使用createReadStream方法创建一个将文件内容读取为流数据的Readtream对象:

fs.createReadStream(path,[options])
//第一个参数:指定需要被读取的文件的完整路径及文件名
//第二个参数:属性及其作用为:
flags:用于指定对该文件采取什么操作,默认为'r',
flag'r':读取文件,如果文件不存在则抛出异常
'r+':读取并写入文件,如果文件不存在则抛出异常
'rs':以同步方式读取文件并通知操作系统忽略本地文件系统缓存,如果文件不存在则抛出异常。因为本属性值忽略本地缓存,适用于操作网络文件系统,但由于其对性能产生一定的负面影响,不建议在其他环境下使用
'w':写入文件,如果文件不存在则创建文件,如果文件存在则清空文件内容
'wx':作用与'w'类似,但以排他方式写入文件
'w+':读取并写入文件。如果不存在则创建文件,如果该文件已存在则清空文件内容
'wx+':作用与'w+'类似,但是以排他方式写入文件
'a':追加写入文件,如果文件不存在则创建文件
'ax':作用与'a+'类似,但是以排他方式打开文件
encoding:用于指定使用什么编码格式来读取该文件,可指定属性值为‘utf8’,‘ascii’与‘base64’
autoClose:用于指定是否关闭在读取文件时操作系统内部使用的文件描述符
false:文件不会自动关闭
true:文件读取完毕或读取文件过程中产生错误文件会自动关闭(默认值)
start:指定文件的开始读取文件位置
end:指定文件的结束读取位置

eg:

  1 var fs = require('fs')
2 var file = fs.createReadStream('./message.txt','utf8',{start:0,end:9})
3 file.on('open',function(fd){
4 console.log('开始读取文件')
5 })
6 file.on('data',function(data){
7 console.log('读取到的数据: ')
8 console.log(data)
9 })
10 file.on('end',function(){
11 console.log('文件已全部读取完毕')
12 })
13 file.on('close',function(){
14 console.log('文件被关闭')
15 })
16 file.on('error',function(err){
17 console.log('读取文件错误')
18 })

运行显示结果为:

[root@kuber2 webproject]# node app6.js
开始读取文件
读取到的数据:
喜欢编 文件已全部读取完毕
文件被关闭
[root@kuber2 webproject]#

下面简介pause方法:暂停data事件的触发,停止文件的读取操作,而已经被读取到操作系统缓存区中的数据也将被暂时保存在操作系统缓存中。可利用resume恢复data事件的触发

eg:

  1 var fs = require('fs')
2 var readStream = fs.createReadStream('./message.txt')
3 readStream.pause()
4 readStream.on('data',function(data){
5 console.log('获取到的数据为:'+ data)
6 })
7
8 setTimeout(function(){readStream.resume()},1000)
~

显示结果为,延时1s后显示内容:

[root@kuber2 webproject]# node app5.js
获取到的数据为: 喜欢编 [root@kuber2 webproject]#

4.2 使用WriiteStream对象写入文件

利用createWriteStream方法创建一个流数据写入文件中的WriteStream对象

fs.createWriteStream(path,[options])
//第一个参数:指定需要被写入的文件的完整路径及文件名
第二个参数:
flags:用于指定对该文件采取什么操作,默认为'w',
flag'r':读取文件,如果文件不存在则抛出异常
'r+':读取并写入文件,如果文件不存在则抛出异常
'rs':以同步方式读取文件并通知操作系统忽略本地文件系统缓存,如果文件不存在则抛出异常。因为本属性值忽略本地缓存,适用于操作网络文件系统,但由于其对性能产生一定的负面影响,不建议在其他环境下使用
'w':写入文件,如果文件不存在则创建文件,如果文件存在则清空文件内容
'wx':作用与'w'类似,但以排他方式写入文件
'w+':读取并写入文件。如果不存在则创建文件,如果该文件已存在则清空文件内容
'wx+':作用与'w+'类似,但是以排他方式写入文件
'a':追加写入文件,如果文件不存在则创建文件
'ax':作用与'a+'类似,但是以排他方式打开文件
encoding:用于指定使用什么编码格式来读取该文件,可指定属性值为‘utf8’,‘ascii’与‘base64’
autoClose:用于指定是否关闭在读取文件时操作系统内部使用的文件描述符
false:文件不会自动关闭
true:文件读取完毕或读取文件过程中产生错误文件会自动关闭(默认值)
start:指定文件的开始写入的位置,如果要在文件中追加写入数据,需要将flags属性改为‘a’

writeStream对象具有一个write方法,用于将流数据写入到目录对象中,该方法的使用方式如下所示:

writeable.write(chunk,[encoding],[calllbcak])
//第一个参数:用于指定需要写入的数据,可以为Buffer对象或一个字符串,
//第二个参数:当以字符串写入时,用于指出以何种编码形式写入
callback:function(){
//写入完毕时所要回调的回调函数
}

writeStream对象的write方法返回一个布尔值

返回true:操作系统缓存区中还可以写入数据
false:缓存区中已经全部被写满

writeStream对象的end方法用于当完成数据写入后,关闭文件

writeable.end([chunk],[encoding],[callback])
//第一个参数:用于指定在文件关闭之前需要在文件中追加写入的数据
第二个参数:用于指定以何种编码形式写入目标对象
callback:function(){
//回调函数代码
}

WriteStream对象具有一个bytesWritten属性,该属性值为当前已在文件中写入数据的字节数

eg:

  1 var fs =require('fs')
2 var file = fs.createReadStream('./message.txt')
3 var out = fs.createWriteStream('./anothermessage.txt')
4 file.on('data',function(data){
5 out.write(data)
6 })
7 out.on('open',function(fd){
8 console.log('需要被写入的文件已经打开')
9 })
10 file.on('end',function(){
11 out.end('再见',function(){
12 console.log('文件全部写入完毕')
13 })
14
15 console.log('共写入%d字节数据',out.bytesWritten)
16 })

运行后显示为:

[root@kuber2 webproject]# node app7.js
需要被写入的文件已经打开
共写入11字节数据
文件全部写入完毕
[root@kuber2 webproject]#

当缓存区读满时会触发drain事件,writeStream的write方法返回为true时,说明缓存区未满,为fasle时,说明缓存区已满

我们还可以使用ReadStream对象的pipe方法执行文件的复制操作:

readStream.pip(destination,[options])
//第一个参数:为一个可用于写入流数据的对象
options:true:表示当数据全部读取完毕时,立即将操作系统中的剩余数据全部在写入文件并关闭
false:不关闭文件

eg

var fs = require('fs')
var file = fs.createReadSream('./message.txt')
var out = fs.createWriteStream('./anotherMessages.txt')
file.pipe(out)

可以利用unpipe方法取消目标文件的写入操作

readStream.unpipe([destination])

5.对路径进行操作

path模块可对路径进行处理,具体包含的方法如作用如下:

方法 作用
normalize 将非标准路径字符串转换为标准路径字符串
path.normalize(p)p为需要被转换的路径字符串
该方法返回被转换后的路径字符串
join 将多个参数值字符串结合为一个路径字符串
path.join([path1],[path2],[...])
该方法返回结合而成的路径字符串
resolve 以应用程序根目录为起点,根据所有的参数值字符串解析处一个绝对路径

path.resolve(path1,[path2],[...])

该方法返回解析出的的路径字符串
relative 获取连个路径之间的相对关系

path.relative(from,to)

该方法返回以第一个路径为当前路径,返回第二个路径的相对路径
dirname 获取一个路径的目录名

path.dirname(p)

参数为一个路径

该方法返回一个目录名
basename 获取一个路径的文件名

path.basename(p,[ext])

p为一个路径

ext为所返回的文件名中去除该文件的扩展名

该方法返回一个目录名
extname 获取一个路径的扩展名

path.extname(p,[ext])

p为一个路径

该方法返回一个扩展名
path.sep属性 属性值为操作系统指定文件的文件分隔符

该方法返回一个分割符
path.delimiter属性 属性值为操作系统指定路径分隔符

该方法返回一个分割符
上一篇:分布式版本控制git常见问题之gitignore冲突(精简版)


下一篇:Java 远程通讯技术及原理分析