node.js-fs

版权声明:来一来,看一看,有钱的捧个人场,没钱的你不得捧个人场 https://blog.csdn.net/wait_for_eva/article/details/83575863

简介

fs 模块是node.js中的文件操作模块。

  • 导入
const fs = require('fs');
  • 异步
fs.readFile('file.txt', function(err, data){
    if(err){
        console.log('something was wrong : ', err.toString());
        return;
    }
    console.log('async read : ', data.toString());
})

readFile:默认异步方式处理,自定义回调函数

callback:双入参,第一个err错误信息,后面的data是读取的数据。

  • 同步
var content = fs.readFileSync('file.txt');
console.log('sync read : ', content);

readFileSync:常用方式,无异步

开篇简介到此为止,接下来深入详解。

状态

const fs = require('fs');
fs.stat('file.txt', function(err, status){
    if(err){
        console.log('something was wrong : ', err.toString());
        return;
    }
    console.log(status);
})

运行一下就知道是啥东西了,还有相关的状态判断;

方法 描述
isFile 是文件否
isDirectoty 是目录否
isBlockDevice 块设备否
isCharacterDevice 字符设备否
isSymbolicLink 软链接否
isFIFO FIFO
isSocket SOCKET
const fs = require('fs');
fs.stat('file.txt', function(err, status){
    if(err){
        console.log('something was wrong : ', err.toString());
    }
    if(status.isFile()){
        console.log('this file is a file, not directory');
    }else if(status.isDirectory()){
        console.log('this file is a directory');
    }else{
        console.log('unknow file type');
    }
})

写入

const fs = require('fs');
fs.writeFile('file.txt', 'new content', function(err){
    console.log('this is callback');
    if(err){
        console.log(err.toString());
        return;
    }
    console.log('write successful');
    
})

简介的例子相对应,这个更容易理解。

不过其中的file.txt的位置,也可以是文件描述符,后面会使用。

运行能够发现,文件内容每次都在覆盖,这因为差了一些可选参数,{encoding, mode, flag}

encoding:指定编码,默认utf-8

mode:指定模式,默认0666

flag:指定文件模式,默认w

const fs = require('fs');
fs.writeFile('file.txt', 'append Conent', {'flag':'a'}, function(err){
    if(err){
        console.log(err);
        return;
    }
    console.log('write success');
});

可选参数可有可无,即使json指定了,也不用全部设置。

这下去看,应该是append的了。

打开

前面都是文本文件,接下来说一下文件描述符。

const fs = require('fs');
fs.open('file.txt', 'r+', function(err, fd){
    if(err){
        console.log(err);
        return;
    }
    console.log('open success');
})

再详细复述一下文件的模式

模式 描述
r 只读模式,无则报错
r+ 读写模式,无则报错
rs 只读模式,同步读取
rs+ 读写模式,同步操作
w 只写模式,无则创建
wx 只写模式,存在失败
w+ 读写模式,无则创建
wx+ 读写模式,存在失败
a 追加模式,无则创建
ax 追加模式,存在失败
a+ 读写追加,无则创建
ax+ 读写追加,存在失败
fs.open(path, flags[, mode], callback)

整体调用参数中,mode是可选参数,同linux

function callback(err, fd){
    ...
}

回调函数两个入参

err:老相识

fd:文件描述符,后续加深

再读

const fs = require('fs');
fs.open('file.txt', 'r', function(err, fd){
    if(err){
        console.log('something was wrong : ', err);
        return;
    }
    fs.readFile(fd, function(err, data){
        if(err){
            console.log('fd error : ', err);
            return;
        }
        console.log('content : ', data.toString());
    })
})

随便可以试,filename的地方都可以更换为fd

但是,再操作的时候,读写属性关键看fd的。

const fs = require('fs');
fs.open('file.txt', 'w', function(err, fd){
    if(err){
        console.log('something was wrong : ', err);
        return;
    }
    fs.readFile(fd, function(err, data){
        if(err){
            console.log('fd error : ', err);
            return;
        }
        console.log('content : ', data.toString());
    })
})

如果模式不对,就会报错,这个时候就多关注一下fd的模式。

再写

其实没啥变化,就是filename替换为了fd,不必再说。

异步

  • 读取
const fs = require('fs');
var buffer = Buffer.alloc(1024);
fs.open('file.txt', 'r', function(err, fd){
    if(err){
        return;
    }
    fs.read(fd, buffer, 0, buffer.length, 0, function(err, readLength){
        if(err){
            return;
        }
        console.log('read bytes length : ', readLength);
        console.log('read file content : ', buffer.slice(0, readLength).toString());
    })
});

fs.read(fd, buffer, offset, length, position, callback)

offsetbuffer的写起始位置

length:想要读取的长度

position:文件开始读取位置

callback:回调函数

callback(err, length, buffer)

err:老东西

length:已经读取的长度

buffer:读取的buffer

  • 截取
const fs = require('fs');
var buffer = Buffer.alloc(1024);
fs.open('file.txt', 'r+', function(err, fd){
    if(err){
        return;
    };
    fs.ftruncate(fd, 5, function(err)){
    	if(err){
        	return;
    	};
    	fs.read(fd, buffer, 0, buffer.length, 0, function(err, length, buf){
            if(err){
                return;
            }
            console.log('read content : ', buffer.slice(0, length).toString());
    	});
    }
})

截取是真实的文件修改,不是部分读取,文件内容会被截断。

  • 关闭
fs.close(fd, function(err){
    if(err){
        console.log('something was wrong : ', err);
        return;
    }
    console.log('file was closed !');
})

删除

const fs = require('fs');
fs.unlink('file.txt', function(err){
    if(err){
        console.log('something was wrong : ', err);
        return;
    }
    console.log('file was deleted !');
})

目录

  • 创建
const fs = require('fs');
fs.mkdir('./newDir', function(err){
    if(err){
        return;
    }
    console.log('mkdir over');
})
  • 读取
const fs = require('fs');
fs.readdir('.', function(err, files){
    files.forEach(function(file){
        console.log(file);
    });
});
  • 删除
const fs = require('fs');
fs.rmdir('./dir', function(){
    console.log('remove over');
});

更多

更多更全请参看官方文档

猜你喜欢

转载自blog.csdn.net/wait_for_eva/article/details/83575863