5. 其他文件系统任务
5.1 验证路径的存在性
fs.exists(path, callback)
fs.existsSync(path)
fs.existsSync(path) 返回true或false,这取决于路径是否存在。fs.exists()需要实现一个调用完成时将要执行的回调函数。根据路径是否存在,此回调函数将被传入true或false。
fs.exists('filesystem.js', function(exists) {
console.log(exists ? 'Path Exists' : 'Path Does Not Exists') ;
}) ;
5.2 获取文件信息
fs.stat(path, callback)
fs.statSync(path)
fs.statsSync()方法返回一个Stats对象。执行fs.stats()方法,而Stats对象作为第二个参数传递到回掉函数。第一个参数是error,如果发生错误的话。
属性/方法 | 说明 |
---|---|
isFile() | 如果该条目是一个文件,则返回true |
isDirectory() | 如果该条目是一个目录,则返回true |
isSocket() | 如果该条目是一个套接字,则返回true |
dev | 指定文件所在设备的ID |
mode | 指定文件的访问模式 |
size | 指定文件的字节数 |
blksize | 指定用于存储该文件的块大小,以字节为单位 |
blocks | 指定文件在磁盘上占用的块的数目 |
atime | 指定上次访问文件的时间 |
mtime | 指定文件的最后修改时间 |
ctime | 指定文件的创建时间 |
var fs = require('fs') ;
fs.stat('file_stats.js', function (err, stats) {
if (!err) {
console.log('stats: ' + JSON.stringify(stats, null, '')) ;
console.log(stats.isFile() ? 'Is a File' : 'Is not a File') ;
console.log(stats.isDirectory() ? 'Is a Folder' : 'Is not a Folder') ;
console.log(stats.isSocket() ? 'Is a Socket' : 'Is not a Socket') ;
stats.isDirectory() ;
stats.isBlockDevice() ;
stats.isCharacterDevice() ;
stats.isFIFO() ;
stats.isSocket() ;
}
}) ;
5.3 列出文件
fs.readdir(path, callback)
fs.readdirSync(path)
var fs = require('fs') ;
var Path = require('path') ;
function WalkDirs(dirPath) {
console.log(dirPath) ;
fs.readdir(dirPath, function (err, entries) {
for (var idx in entries) {
var fullPath = Path.join(dirPath, entries[idx]) ;
(
function (fullPath) {
fs.stat(fullPath, function (err, stats) {
if (stats && stats.isFile()) {
console.log(fullPath) ;
} else if (stats && stats.isDirectory()) {
WalkDirs(fullPath) ;
}
}) ;
}
)(fullPath) ;
}
}) ;
}
WalkDirs('../book') ;
5.4 删除文件
fs.unlink(path, callback)
fs.unlinkSync(path)
fs.unlink('new.txt', function(err){
console.log(err ? 'File Delete Failed' : 'File Deleted') ;
}) ;
5.5 截断文件
截断(Truncate)文件是指通过把文件结束处设置为比当前小的值来减小文件的大小。
fs.truncate(path, len, callback)
fs.truncateSync(path, len)
下面代码段说明了把名为log.txt的文件截断成零字节的过程:
fs.truncate('log.txt', function(err){
console.log(err ? 'File Truncate Failed' : 'File Truncated') ;
}) ;
5.6 建立和删除目录
fs.mkdir(path, [mode], callback)
fs.mkdirSync(path, [mode])
使用异步方法的时候,需要等待创建目录的回调函数完成后,才能创建该目录的子目录。
fs.mkdir('./data', function(err) {
fs.mkdir('./data/folderA', function(err) {
fs.mkdir('./data/folderA/folderB', function(err) {
}) ;
}) ;
}) ;
fs.rmdir(path, callback)
fs.rmdirSync(path)
使用异步方法的时候,在删除父目录之前,需要等待删除该目录的回调函数完成。
fs.rmdir('./data/folderA/folderB', function(err) {
fs.rmdir('./data/folderA', function(err) {
fs.rmdir('./data', function(err) {
}) ;
}) ;
}) ;
5.7 重命名文件和目录
fs.rename(oldPath, newPath, callback)
fs.renameSync(oldPath, newPath)
fs.rename('old.txt', 'new.txt', function(err) {
console.log(err ? 'rename failed' : 'file renamed') ;
}) ;
5.8 监视文件更改入
虽然它并不完全稳定,但fs模块提供了监视文件,并在文件发生变化时执行回调函数的有用工具。监视确实在底层操作系统中产生一些开销,所以应该适可而止使用它们。
fs.watchFile(path, [options], callback)
你也可以传入options,这是一个对象,它包含persistent(持续)和interval属性。如果你想只要文件被监视,就继续运行这个程序,则把persistent属性设为true。interval属性指定你所需文件更改的轮询时间,以毫秒为单位。
当文件发生变化时,callback函数就会被执行,并传递当前和以前的stats对象。
fs.watchFile('log.txt', {persistent: true, interval: 5000}, function(curr, prev) {
console.log('log.txt modified at: ' + curr.mtime) ;
console.log('Previous modification was: ' + prev.mtime) ;
}) ;