关于node.js:node常用内置模块fs模块

4次阅读

共计 5038 个字符,预计需要花费 13 分钟才能阅读完成。

node 罕用内置模块 (fs 模块)

划分:

文件操作的三个基本概念:权限位、标识符、操作符

1. 基本操作类

2. 罕用 API

个别分为异步操作与同步操作,这里应用异步操作试验 (一次性的文件操作,没有应用 buffer),Node.js 中有谬误优先的概念,当操作可能会呈现谬误时,回调函数的第一个参数常是谬误对象

const fs = require('fs');
const path = require('path');

// readFile
fs.readFile(path.resolve('msg.txt'), 'utf-8', (error, data) => {if (!error) console.log(data);
});

// writeFile (overwrite),门路不存在时,会创立门路,操作配置对象,可省略
fs.writeFile(path.resolve('msg.txt'), 'Hello Node.js', {
    mode: 0o666,        // 权限
    flag: 'a+',         // 追加
    encoding: 'utf-8'   // 编码
}, (error) => {if (!error) console.log('write success');
})

// apendFile
fs.appendFile(path.resolve('msg.txt'), '\nHello Node.js', {}, (err) => {if (!err) console.log('append success');
});


// copyFile
fs.copyFile(path.resolve('msg.txt'), path.resolve('msg2.txt'), (err) => {if (!err) console.log('copy success');
});

// watchFile
fs.watchFile(path.resolve('msg.txt'), {interval: 1000},(curr, prev) => {console.log(curr.mtime);
    console.log(`${curr.size} ${prev.size}`);
})
fs.appendFile(path.resolve('msg.txt'), '\nHello Node.js', {}, (err) => {if (!err) console.log('append success22');
    setTimeout(() => {fs.unwatchFile(path.resolve('msg.txt'));        // 勾销监听
    }, 2000);
});

open and close:

fs.open(path.join(__dirname,'msg.txt'),'r',(error,fd)=>{if(!error){console.log(fd);
        fs.close(fd,(err)=>{if(!err) console.log('close success');
        });
    }
});

// 文件读写:

const fs = require('fs');
const path = require('path');



/**
 * read         将数据从磁盘文件中读取到内存中的 buffer
 * fd           定位以后被关上的文件
 * buffer       存储读取到的数据
 * offset       示意在 buffer 那个地位上写入
 * length       读入 buffer 的长度
 * position     从磁盘文件中的那个地位开始读取
 */
let buf = Buffer.alloc(10);
fs.open(path.join(__dirname,'msg.txt'),'r',(err,rfd)=>{if(err) throw err;                              
    fs.read(rfd,buf,1,4,2,(err,readBytes,buffer)=>{console.log(readBytes);
        console.log(buffer);
        console.log(buffer.toString());
    })
    fs.close(rfd);
})



/**
 * write        将数据从内存中 buffer 的数据写入到磁盘文件中
 */
let buf2 = Buffer.from('1234567890');
fs.open('b.txt','w',(err,wfd)=>{fs.write(wfd,buf2,1,4,0,(err,written,buffer)=>{console.log(written);
        console.log(buffer);
        console.log(buffer.toString());
    })
    fs.close(wfd);
})

封装文件 copy:

const fs = require('fs');
const path = require('path');

function fileCopy(resFile, newFile, bufLen) {let buf = Buffer.alloc(bufLen);
    let readOffset = 0;
    fs.open(resFile, 'r', (err, rfd) => {if (err) throw err;
        fs.open(newFile, 'w', (err, wfd) => {if (err) throw err;
            function readAnWrite() {fs.read(rfd, buf, 0, bufLen, readOffset, (err, readBytes, buffer) => {if (!readBytes) {
                        // readBytes === 0 阐明读取结束
                        fs.close(rfd, () => {});
                        fs.close(wfd, () => {});
                        console.log('copy success');
                        return;
                    }
                    readOffset += readBytes;
                    fs.write(wfd, buf, 0, readBytes, err => {if (err) throw err;
                        readAnWrite();});
                });
            }
            readAnWrite();})
    })
}
fileCopy(path.join(__dirname, 'msg.txt'), path.join(__dirname, 'b.txt'), 5);

3. 常见操作目录 API

api:

const fs = require('fs');
const path = require('path');

// access   判断是否有权限拜访文件或目录
fs.access(path.join(__dirname,'b.txt'),err=>console.log(err?err:'success'));

// stat 获取文件信息
fs.stat(path.join(__dirname,'b.txt'),(err,stats)=>{if(!err) console.log(stats.isFile());
});

// mkdir    创立目录
fs.mkdir(path.join(__dirname,'test/jiang'),{recursive:true},err=>console.log(err?err:'make success'));


// rmdir    删除目录
fs.rmdir(path.join(__dirname,'test'),{recursive:true},err=>console.log(err?err:'dir remove success'));

// readdir  读取目录    返回文件名、目录数组
fs.readdir(path.join(__dirname,'./'),(err,files)=>{if(!err) console.log(files);
});

// unlink   删除文件
fs.unlink(path.join(__dirname,'b.txt'),err=>console.log(err?err:'file remove success'));

目录创立之同步实现:

const fs = require('fs');
const path = require('path');

// access   判断是否有权限拜访文件或目录
fs.access(path.join(__dirname,'b.txt'),err=>console.log(err?err:'success'));

// stat 获取文件信息
fs.stat(path.join(__dirname,'b.txt'),(err,stats)=>{if(!err) console.log(stats.isFile());
});

// mkdir    创立目录
fs.mkdir(path.join(__dirname,'test/jiang'),{recursive:true},err=>console.log(err?err:'make success'));


// rmdir    删除目录
fs.rmdir(path.join(__dirname,'test'),{recursive:true},err=>console.log(err?err:'dir remove success'));

// readdir  读取目录    返回文件名、目录数组
fs.readdir(path.join(__dirname,'./'),(err,files)=>{if(!err) console.log(files);
});

// unlink   删除文件
fs.unlink(path.join(__dirname,'b.txt'),err=>console.log(err?err:'file remove success'));

目录创立之异步实现:

const fs = require('fs');
const path = require('path');
const {promisify} = require('util');

// 回调函数模式
function mkDir(dirPath, cb) {let parts = dirPath.split('/');
    let index = 1;
    function next() {if (index > parts.length) return cb && cb();
        let current = parts.slice(0,index++).join('/');
        fs.access(current,(err)=>{if(err){fs.mkdir(current,next); // 创立目录,用回调函数创立下一层目录
            }else{next();
            }
        })
    }
    next();}
mkDir('test/test2/test3', () => {console.log('创立胜利')
})

// 将 access 与 mkdir 解决成 async/await 格调
// promise 模式
const access = promisify(fs.access);
const mkdir = promisify(fs.mkdir);

async function myMkDir(dirPath,cb){let parts = dirPath.split('/');
    for(let index = 1; index <= parts.length;index++){let current = parts.slice(0,index).join('/');
        try{await access(current);
        }catch(err){await mkdir(current);
        }
    }
    cb && cb();}
myMkDir('test/test2/test3',()=>{console.log('创立胜利')
});

目录删除之异步:

function myRemDir(dirPath, cb) {fs.stat(dirPath, (err, stats) => {if (stats.isDirectory()) {
            // 目录
            fs.readdir(dirPath, (err, files) => {let dirs = files.map((item) => path.join(dirPath, item));
                let index = 0;
                function next() {if (index == dirs.length) {return fs.rmdir(dirPath, cb);
                    } else {myRemDir(dirs[index++], next);
                    }
                }

                next();})

        } else {fs.unlink(dirPath, cb);
        }
    });
}
myRemDir(path.join(__dirname, 'temp'), () => {console.log('删除胜利');
})
正文完
 0