node.js文件操作系统实例详解

2020-06-17 05:35:11易采站长站整理

问题来了:

不一致的表现。
不可用的场景。
linux上要recursive咋整。

The fs.watch API is not 100% consistent across platforms, and is unavailable in some situations. The recursive option is only supported on OS X and Windows.

备忘,不可用的场景。比如网络文件系统等。

For example, watching files or directories can be unreliable, and in some cases impossible, on network file systems (NFS, SMB, etc), or host file systems when using virtualization software such as Vagrant, Docker, etc.

另外,listener回调有两个参数,分别是event、filename。其中,filename仅在linux、windows上会提供,并且不是100%提供,所以,尽量不要依赖filename。

在linux、osx上,fs.watch()监听的是inode。如果文件被删除,并重新创建,那么删除事件会触发。同时,fs.watch()监听的还是最初的inode。(API的设计就是这样的)

结论:怎么看都感觉这个API很不靠谱,虽然性能比fs.watchFile()要高很多。

先来个例子,在osx下测试了一下,简直令人绝望。。。无论是创建、修改、删除文件,evt都是rename。。。


var fs = require('fs');
var options = {
persistent: true,
recursive: true,
encoding: 'utf8'
};
fs.watch('../', options, function(event, filename){
console.log('触发事件:' + event);
if(filename){
console.log('文件名是: ' + filename);
}else{
console.log('文件名是没有提供');
}
});

修改下fileForWatch.txt,看到下面输出。。。感觉打死也不想用这个API。。。

贴下环境:osx 10.11.4, node v6.1.0。

触发事件:rename
文件名是: fs/fileForWatch.txt___jb_bak___
触发事件:rename
文件名是: fs/fileForWatch.txt
触发事件:rename
文件名是: fs/fileForWatch.txt___jb_old___
触发事件:rename
文件名是: .idea/workspace.xml___jb_bak___
触发事件:rename
文件名是: .idea/workspace.xml
触发事件:rename
文件名是: .idea/workspace.xml___jb_old___

修改所有者

参考linux命令行,不举例子了。。。

fs.chown(path, uid, gid, callback) fs.chownSync(path, uid, gid) fs.fchown(fd, uid, gid, callback) fs.fchownSync(fd, uid, gid)

修改权限

可以用fs.chmod(),也可以用fs.fchmod()。两者的区别在于,前面传的是文件路径,后面传的的文件句柄。

fs.chmod)、fs.fchmod()区别:传的是文件路径,还是文件句柄。
fs.chmod()、fs.lchmod()区别:如果文件是软连接,那么fs.chmod()修改的是软连接指向的目标文件;fs.lchmod()修改的是软连接。

fs.chmod(path, mode, callback) fs.chmodSync(path, mode)