1129-fs(内置模块)的常用方法

260 阅读3分钟

fs内置核心模块 file System 提供文件读写的一些方法,方法多数都存在两种,一种是异步的一种是同步。

  • 读取文件,默认读出来的都是buffer。可通过参数指定编码 utf8;
读取文件规则:
    1.读取文件,文件必须存在,否则报错;
    2.不能通过/读取内容,/表示的是根目录
    3.读取的默认类型是buffer
    
//同步读取,通过返回值接收内容
let content = fs.readFileSync('1.txt');//不指定编码读出来的是buffer
let content = fs.readFile('1.txt','utf8');//指定编码读出来的是字符串,相当于buffer.toString()了 

//异步读取,通过callback接收内容;
fs.readFile('1.txt',function(err,data){//错误优先
    if(err)return err;
    console.log(data); //没有指定编码,读出的是buffer
})
fs.readFile('1.txt','utf8',(err,data)=>{
    if(err) return err;
    console.log(data)//指定了编码,读出的是字符串
})

  • 写如文件
写文件规则:
    1.读取的默认值是buffer,写入时默认都会把内容toString然后写入,都是utf8编码写入。
    2.读取的文件必须存在,否则报错。写入的时候,文件不存在会自动创建。
    3.写入的时候,里面有内容会被覆盖掉。
//同步写入
fs.writeFileSync('1.txt','你好'); //你好
fs.writeFileSync('1.txt',Buffer.from("你好"))//你好
fs.writefileSync('1.txt',{a:1,b:2})//[Object object]
//异步写入
fs.writeFile('1.txt','你好',err=>{
    if(err){
        console.log(err)
    }
})  

//读取文件,不管同步还是异步,都会把内容读到内存中。如果文件过大,可能导致淹没可用内存,消耗内存。所以一般都是边读边写,降低内存消耗

//同步copy readFileSync + writeFileSync
function copy(source,targer){
    let content = fs.readFileSync(source)
    fs.writeFileSync(target,target)
}

//异步copu  readFile + wirteFile
fucntion copy(source,target,callback){
    fs.readFile(source,function(err,data){
        if(err)return callback(err);
        <!--fs.writeFile(target,data,callback)--> //会覆盖
        fs.appendFile(target,data,callback)//不会覆盖,会文件中追加内容
    })
}
- 文件状态 fs.stat
```javascript
//fs.stat('\',(err,stats)=>{})
//fs.stat 可以获取文件或者文件夹状态

//1.可以查看文件或者目录的一些属性 stats.***
// atime: 2018-11-29T11:51:51.580Z, 访问时间 access time
// mtime: 2018-10-22T06:55:28.377Z, 修改时间modify time(文件最近修改时间)
// ctime: 2018-10-22T06:55:28.377Z,  变化时间 change time(文件状态最近更改时间)变化 > 修改
// birthtime: 2017-10-25T19:16:04.549Z } 创建时间  birth time
//2.可以查看验证文件或者文件夹是否存在,if(err)console.log('不存在')
//3.可以调用 stats.isFile();stats.isDirectory();方法验证是不是文件或者文件夹
fs.stat('/',(err,stats)=>{
    if(err)return console.log('文件不存在')
    if(stats.isFile()){
        console.log('这是文件')
    }
    if(stats.isDirectory()){
        console.log('这是文件夹')
    }
})

  • 创建目录,只能一级一级的创建。
//成功
fs.mkdir('/a',err=>{
    if(err)return console.log('创建失败')
})
//如果/a存在,则不会报错,会创建成功;如果/a不存在,则会报错
fs.mdir('/a/b',err=>{
    if(err) return console.log('创建失败')
})

//通常都需要自己js创建目录
function makep(url,cb){
    let ary = url.split('/');
    let i = 0;
    function make(path){
        if(i>=ary.length){//创建完成
            return cb(null)
        }
        fs.stat(path,function(err,stats)=>{//验证目录是否存在
            if(err){
                fs.mkdir(path,function(err){
                if(err) return cb(err);
                i++;
                let p = ary.slice(0,i+1).join('/')
                make(p)
                })
            }else{
                i++;
                let p = ary.slice(0,i+1).join('/')
                make(p)  
            }
        })
    }
    make('/'+ary[i])
}
makep('/a/b/c/d',err=>{
    if(err)console.log('失败')
    console.log('创建成功')
}