node.js中fs文件系统模块的使用

node.js中为我们提供了fs文件系统模块,实现对文件或目录的创建,修改和删除等操作。

fs模块中,所有的方法分为同步和异步两种实现。

有 sync 后缀的方法为同步方法,没有 sync 后缀的方法为异步方法。

一、文件的整个读取

const fs = require('fs');

//参数一表示读取的文件
//参数二表示读取的配置,{encoding:'null',flag:'r'}
//encoding 表示编码方式
//flag 表示文件系统标志
//如果没有指定参数二中的encoding,则data返回的是一个Buffer
fs.readFile('./1.txt',function (err,data) {
    console.log(data);
});

//如果指定了,则data返回的是解析后的字符串
fs.readFile('./1.txt',{'encoding': 'utf8','flag': 'r'},data) {
    console.log(data);
});  

或同步读取:

const fs = require('fs');

let data = fs.readFileSync('./1.txt');
console.log(data);

let data2 = fs.readFileSync('./1.txt',{'encoding': 'utf8'});
console.log(data2);

二、往文件写入数据

const fs = require('fs');

//参数一表示需要写入的文件
//参数二表示写入的数据
//参数三表示写入配置 {encoding:'utf8',mode:'0o666',flag:'w'}
//encoding 表示文件编码
//mode 表示文件权限
//flag 表示表示文件系统标志
fs.writeFile('./1.txt','数据',{'mode': 0o666,'flag': 'w'},function (err) {
    console.log(err);
});

//注意如果文件已存在,默认会覆盖写入
fs.writeFile('./1.txt','你好',function (err) {
    console.log(err);
});

//如果想追加写入,将flag设置为'a'就可以了。
fs.writeFile('./1.txt',{'flag': 'a'},function (err) {
    console.log(err);
});

注意,writeFile() 默认会以覆盖的方式写入数据。

或者同步写入数据:

const fs = require('fs');

fs.writeFileSync('./1.txt','数据');

关于 mode 文件权限的说明:

在linux中文件的权限会为3种,4-表示可读,2-表示可写,1-表示可执行。它们之间的相互组合形成不同权限。

对于文件,有三个权限分配,1:文件所有者,2:文件所属组,3:其他用户。

关于 flag 文件系统标志的说明:

r 表示 读取
表示 写入
表示 同步
表示 追加
表示 文件存在就报错
表示 增加相反操作

 r+ 与 w+ 区别,文件不存在时,r+ 不会创建文件,而 w+ 会创建。如果文件存在 r+ 不会清空文件,而 w+ 会清空文件。

三、往文件中追加数据

const fs = require('fs');

fs.appendFile('./1.txt',function (err) {
    console.log(err);
});

fs.appendFileSync('./1.txt','同步追加');

四、拷贝文件

const fs = require('fs');

//参数一表示源文件
//参数二表示目标文件
//参数三表示拷贝操作的修饰符,默认0
//参数四表示回调函数
fs.copyFile('./1.txt','./2.txt',function (err) {
    console.log(err);
});

//同步拷贝文件
fs.copyFileSync('./1.txt','./3.txt');

五、打开文件,读取文件,写入文件

const fs = require('fs');

//参数一表示文件路径
//参数二表示文件系统标志
//参数三表示文件权限
//参数四表示回调函数,err表示错误,fd表示文件描述符,是一个整型
fs.open('./1.txt','r+',0o666,fd) {
    //创建一个3字节的Buffer,用来接收数据
    let rbuf = Buffer.alloc(3);
    //参数一表示文件描述符
    //参数二表示接收数据的Buffer
    //参数三表示往Buffer中写入的偏移量
    //参数四表示读取的字节数
    //参数五表示从文件中读取的位置,如果为null,则是文件的当前位置读取
    //参数六表示回调函数,err表示错误,bytesRead表示实际读取的字节,buffer表示接收数据的Buffer
    fs.read(fd,rbuf,3,bytesRead,buffer) {
        console.log(rbuf.toString());
        console.log(bytesRead);
    });

    let wbuf = Buffer.from('中国');
    //参数一表示文件描述符
    //参数二表示写入数据的Buffer
    //参数三表示往Buffer中读取的偏移量
    //参数四表示写入的字节数
    //参数五表示从文件中写入的位置,如果不等于数字,则从文件的当前位置写入
    //参数六表示回调函数,err表示错误,written表示实际写入的字节数,buffer表示写入数据的Buffer
    fs.write(fd,wbuf,fs.stat,written,buffer) {
        console.log(written);
    });
}); 

六、同步磁盘缓存,把缓冲区数据刷新到文件中。

const fs = require('fs');

fs.open('./1.txt','w+',fd) {
    let data = Buffer.from('数据\n');
    let task = [];
    //我们往文件中循环写入数据
    for (ix = 0; ix < 1000; ix++) {
        task.push(function () {
            return new Promise((resolve,reject) => {
                fs.write(fd,data,data.length,null,buffer) {
                    if (err) {
                        reject(err);
                    } else {
                        resolve(written);
                    }
                });
            });
        });
    }

    Promise.all(task.map(fn => fn())).then(value => {
        console.log(value);
    },reason => {
        console.log(reason);
    });

    //当们写完数据后,一般会强制刷新缓冲区,让数据写入到文件里,然后关闭文件。
    //因为系统为了效率,我们写入的数据通常会放到一个缓冲区中,当缓冲区满了后,系统就一次把数据写到文件。
    fs.fsync(fd,function (err) {
        console.log(err);
        //关闭文件
        fs.close(fd,function (err) {
            console.log(err);
        })
    });
});

七、创建目录

const fs = require('fs');

//创建目录,默认情况下不支持递归创建目录
fs.mkdir('./a',function (err) {
    console.log(err);
});

//通过设置参数二中的recursive为true,则可以递归创建目录
fs.mkdir('./a/b/c',{'recursive': true},function (err) {
    console.log(err);
}); 

八、删除目录

const fs = require('fs');

//rmdir无法删除非空目录
fs.rmdir('./a',function (err) {
    console.log(err);
});

九、测试文件或目录是否存在,是否可读,是否可写

const fs = require('fs');

let path = './a';

//判断是否存在
fs.access(path,fs.constants.F_OK,function (err) {
    console.log(err ? '不存在' : '存在');
});

//判断是否可读
fs.access(path,fs.constants.R_OK,function (err) {
    console.log(err ? '不可读' : '可读');
});

//判断是否可写
fs.access(path,fs.constants.W_OK,function (err) {
    console.log(err ? '不可写' : '可写');
}); 

十、读取目录下的所有文件

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

//读取目录下所有文件
fs.readdir('./a',files) {
    console.log(files);
});

//递归的读取一个目录所有文件
function readDir(dir) {
    fs.stat(dir,stats) {
        if (stats.isDirectory()) {
            console.log(dir);
            fs.readdir(dir,files) {
                files.map(value => {
                    let cur = path.join(dir,value);
                    fs.stat(cur,stats) {
                        if (stats.isDirectory()) {
                            readDir(cur);
                        } else {
                            console.log(cur);
                        }
                    });
                });
            });
        } else {
            console.log(dir);
        }
    });
}
readDir('./node_modules');

十一、查看文件或目录的详细信息

const fs = require('fs');

//获取目录详细信息
fs.stat('./a',stats) {
    console.log(stats);
});

//获取文件详细信息
fs.stat('./1.txt',stats) {
    console.log(stats);
});

stats.size 表示文件大小。

stats.atime 表示文件中的数据最后访问时间。

stats.mtime 表示文件中的内容修改最后时间。

stats.ctime 表示文件权限,拥有者,所属组,链接数发生改变时的时间。

stats.birthtime 表示文件创建时间。

十二、重命名或移动文件

const fs = require('fs');

//重命名文件
fs.rename('./1.txt','./b.txt',function (err) {
    console.log(err);
});

//移动文件
fs.rename('./2.txt','./a/b/c/2.txt',function (err) {
    console.log(err);
});

十三、删除文件

const fs = require('fs');

//删除文件
fs.unlink('./3.txt',function (err) {
    console.log(err);
});

十四、截取文件

const fs = require('fs');

//截取文件成3个字节
fs.truncate('./b.txt',function (err) {
    console.log(err);
});

 十五、监视文件或目录的状态改变

const fs = require('fs');

//监视目录
fs.watchFile('./a',function (curr,prev) {
    console.log(curr);
    console.log(prev);

    if (curr.mtimeMs !== prev.mtimeMs) {
        console.log('内容发生的改变');
    }
});

  

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


这篇文章主要介绍“基于nodejs的ssh2怎么实现自动化部署”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“基于nodejs...
本文小编为大家详细介绍“nodejs怎么实现目录不存在自动创建”,内容详细,步骤清晰,细节处理妥当,希望这篇“nodejs怎么实现目录不存在自动创建”文章能帮助大...
这篇“如何把nodejs数据传到前端”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这...
本文小编为大家详细介绍“nodejs如何实现定时删除文件”,内容详细,步骤清晰,细节处理妥当,希望这篇“nodejs如何实现定时删除文件”文章能帮助大家解决疑惑...
这篇文章主要讲解了“nodejs安装模块卡住不动怎么解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来...
今天小编给大家分享一下如何检测nodejs有没有安装成功的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文...
本篇内容主要讲解“怎么安装Node.js的旧版本”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎...
这篇“node中的Express框架怎么安装使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家...
这篇文章主要介绍“nodejs如何实现搜索引擎”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“nodejs如何实现搜索引擎...
这篇文章主要介绍“nodejs中间层如何设置”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“nodejs中间层如何设置”文...
这篇文章主要介绍“nodejs多线程怎么实现”,在日常操作中,相信很多人在nodejs多线程怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法...
这篇文章主要讲解了“nodejs怎么分布式”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“nodejs怎么分布式”...
本篇内容介绍了“nodejs字符串怎么转换为数组”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情...
这篇文章主要介绍了nodejs如何运行在php服务器的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇nodejs如何运行在php服务器文章都...
本篇内容主要讲解“nodejs单线程如何处理事件”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“nodejs单线程如何...
这篇文章主要介绍“nodejs怎么安装ws模块”,在日常操作中,相信很多人在nodejs怎么安装ws模块问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法...
本篇内容介绍了“怎么打包nodejs代码”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!
本文小编为大家详细介绍“nodejs接收到的汉字乱码怎么解决”,内容详细,步骤清晰,细节处理妥当,希望这篇“nodejs接收到的汉字乱码怎么解决”文章能帮助大家解...
这篇“nodejs怎么同步删除文件”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇...
今天小编给大家分享一下nodejs怎么设置淘宝镜像的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希