四、fs文件系统模块

Source

         fs模块是Node.js官方提供用来操作文件的模块,属于核心模块,提供了一些列的方法和属性,用来满足用户的操作需求;

引入fs模块

const fs = require('fs');

fs.readFile() 读取

        读取指定的内容,fs.readFile(path[,options],callback) '[ ]'为可选参数 ;path是文件路径,options是用什么编码格式读取文件,callback是读取完成之后通过回调的形式拿到读取失败err和成功dataStr的结果;

// read.txt
被读取的文件
// readFile.js文件
const fs = require('fs');
fs.readFile('./read.txt','utf8',function(err,dataStr){
    console.log(err);         // 读取成功err的值为 null,
    console.log(dataStr);     // 读取dataStr失败,dataStr为undefined
})

文件是否读取成功?

const fs = require('fs');
fs.readFile('./read.txt','utf8',function(err,dataStr){
    if(err){
        return console.log('读取失败:'+err.message);
    }
    console.log('读取的内容:'+dataStr);
})

 将读取的文件名称改掉,使其读取错误结果:read.txt => reads.txt ,没有该文件;


fs.writeFile() 写入

        写入指定内容,fs.writeFile(file,data[,options],callback),file表示文件的存放路径,data是写入的内容,options是编码格式(默utf8),callback完成后回调函数;

const fs = require('fs');
// 往read.txt内写入
fs.writeFile('./read.txt','写入syan123',function(err){
    console.log(err);    // 写入成功err的值为null
})

 判断是否写入成功?

const fs = require('fs');
// 往read.txt内写入
fs.writeFile('./read.txt','写入syan123',function(err){
    if(err){
        console.log("写入失败:"+err.message);
    }
    console.log("写入成功!")
})

fs.writeFile 注意

fs.writeFile() 方法只能用来创建文件,不能创建路径;

重复调用fs.writeFile() 写入同一个文件,新写入的内容会覆盖掉之前的内容;


 文件路径问题

        使用fs.readFile()或者fs.writeFile()中的path路径都是相对路径 ' ./read.txt ',这种方式会出现路径错误的问题:在运行node xx.js 文件时,会在当前所处目录去动态拼接完成路径;

 如以下这样运行的话,路径的拼接就会出现错误,以致于读取失败;        

         这样一来可以通过完整的路径来进行文件的读取,就能够避免掉出现路径拼接出现错误的文体,但带来的是文件的【移植性】会变得很差,不利于维护,如下:

const fs = require('fs');
fs.readFile('C:\\Users\\Administrator\\Desktop\\node\\Node\\fs模块\\read.txt','utf8',function(err,dataStr){
    if(err){
        return console.log('读取失败:'+err.message);
    }
    console.log('读取的内容:'+dataStr);
})

        既然动态的拼接会出现问题,使用完成路径导致文件移植性和维护性差点问题,可以通过以下这种方式 __dirname 表示当前文件所处的目录文件再动态的拼接路径


 __dirname 解决路径问题

const fs = require('fs');
fs.readFile( __dirname + '/read.txt','utf8',function(err,dataStr){
    if(err){
        return console.log('读取失败:'+err.message);
    }
    console.log('读取的内容:'+dataStr);
    console.log('读取目录路径:'+ __dirname);
})


文件的打开模式有以下几种:

'a' 打开文件用于追加。若文件不存在,则创建该文件。
'a+' 打开文件用于读取和追加。若文件不存在,则创建该文件。
'as+'

打开文件用于读取和追加(在同步模式中),若文件不存在,则创建该文件。

'r' 打开文件用于读取。若文件不存在,则会发生异常。
'rs+'

打开文件用于读取和写入(在同步模式中),指示操作系统绕过本地的文件系统缓存。

'w+'

打开文件用于读取和写入。如果文件不存在则创建文件,若文件存在则截断文件。

fs.openSync() 打开文件 —— 同步

        同步打开文件,fs.openSync(path,[flags,mode]),flag是文件系统flag支持,默认是'r';

// openSync.js文件
const fs = require('fs');
const fd = fs.openSync( __dirname + '/read.txt','r');
console.log(fd);    // fd 文件描述符

返回值为:<number>,表示文件描述符的整数;

fs.open() 打开文件 —— 异步

        异步打开文件,fs.open(path,[flags,mode],callback),有callback回调;

// open.js文件
const fs = require('fs');
fs.open(__dirname+'/reads.txt','r',function(err,fd){
    if(err){
        return console.log('文件打开失败!');
    }
    // fd是文件描述符,文件标识
    console.log(fd);
})

         同步和异步打开文件都有返回值<number>表示文件描述符的整数,区别在于异步打开文件有两个回调函数(err,fd),err是异常的错误信息,fd是打开文件后的标识;对应的有同步/异步的打开文件,就有同步和异步的关闭文件;


fs.closeSync() 关闭文件 —— 同步

        同步关闭文件,fs.closeSync(fd),fd为文件关闭的标识;通过fs.openSync() 同步打开文件能获得打开文件的标识返回值 <number> ,同步关闭文件可以通过fs.closeSync(fd) 根据打开文件的标识来关闭;

fs.close() 关闭文件 —— 异步 

        异步关闭文件,fs.close(fd,callback),异步关闭会有callback回调,内部有1和异常参数err;

// close.js文件
const fs = require('fs');
// 打开文件后关闭
fs.open( __dirname + '/read.txt','r',function(err,fd){
    if(err){ 
        return console.log('文件打开失败!');
    }
    fs.close(fd,function(fd,err){
        if(err) throw err;
        console.log('文件正常关闭');
    })
})


 fs.appendFile() 文件追加

        向文件追加内容,fs.appendFile(file,data[,options],callback) ,data是要追加的文件内容,可以是String(字符串)或者buffer(流)对象;现在就往read.txt文件内去追加内容:

// appenFile.js 文件
const fs = require('fs');
const content = '追加的数据内容:syan123';
fs.appendFile(__dirname+'/read.txt',content,function(err){
    if(err){
        return console.log(err);
    }
    console.log('append成功!')
})


fs.unlinkSync() 删除文件 —— 同步

        同步方式删除,fs.unlinkSync(path),返回值是undefined;

// unlinkSync.js文件 —— 观察read.txt文件
const fs = require('fs');
const rs = fs.unlinkSync( __dirname + '/read.txt');
console.log(rs);    // undefined

fs.unlink() 删除文件 —— 异步

        异步方式删除,fs.unlink(path,callback);

// unlink.js文件 —— 观察read.txt文件
const fs = require('fs');
fs.unlink(__dirname + '/read.txt',function(err){
    if(err){
        return console.log('unlink失败');
    }
    console.log('unlink成功');
})


目录操作

fs.mkdir() 创建目录

        创建目录操作,fs.mkdir(path,[mode],callback);mode设置目录权限,默认为0777;

// mkdir.js文件 —— 观察是否出现demo
const fs = require('fs');
fs.mkdir( __dirname + '/demo',function(err){
    if(err){
        return console.log("创建失败!");
    }
    console.log("创建成功!");
})

fs.readdir() 读取目录 

        读取目录操作,fs.readdir(path[,options],callback),异步读取目录内容,options是可以是编码也可以是encoding,encoding为'buffer',返回文件名作为buffer对象传入;callback有两个参数(err,files),err是异常出错的信息,files是目录中文件名称的数组;先在demo文件下面定义两个文件:fileOne.js 和 fileTwo.js ,通过回调中的files获取目录下的文件名称数组;

// readdir.js文件
const fs = require('fs');
fs.readdir(__dirname+'/demo',function(err,files){
    if(err){
        return console.log(err);
    }
    console.log(files);
})

打印出在demo目录下的文件名称数组 [ 'fileOne.js' ,'fileTwo.js' ] ;

fs.stat() 查看目录

        查看目录及文件信息,fs.stat(path,callback),可以通过callback中的参数stats访问文件属性

// stat.js 文件
const fs = require('fs');
fs.stat(__dirname + '/demo',function(err,stats){
    if(err) throw err;
    console.log(stats);
})


检查目录是否存在

        异步检查目录,fs.exists()已经是被废弃掉了的API,使用同步的方式检查,fs.existsSync();

// existsSync.js 文件
// 检查目录是否存在
const fs = require('fs');
const rs =  fs.existsSync(__dirname + '/demo')
console.log(rs);


fs.rmdir() 删除目录 

        删除目录,前提是目录必须是空的,不能包含任何文件;fs.rmdir(path,callback);将demo目录文件删除掉,然后将demo目录删除掉;

// rmdir.js文件
const fs = require('fs');
fs.rmdir(__dirname + '/demo',function(err){
    if(err){
        return console.log("删除demo目录失败!");
    }
    console.log("删除成功!");
})

删除有文件的目录

        删除含有文件的目录,通过先删除文件可以fs.unlink(),再通过fs.rmdir()可以删除空目录即可;下面来删除demo目录,demo目录下还有两个文件fileOne.js和fileTwo.js;

// demo.js文件
const fs = require('fs');
// 读取目录信息
fs.readdir(__dirname + '/demo',function(err,files){
    if(err) throw err;
    console.log("files文件:",files);
    // 删除文件
    files.forEach(function(file){
        console.log(file);
        fs.unlink(__dirname+'/demo/'+file,function(err){
            console.log(__dirname+'/demo'+file);
            if(err){
                return console.log("删除文件失败!");
            }
            console.log("删除文件成功!");
        })
    })
    // 删除目录
    fs.rmdir(__dirname+'/demo',function(err){
        if(err){
            return console.log("目录删除失败!");
        }
        console.log("目录删除成功!");
    })
})

        以上就是关于Node.js中的fs文件操作模块的一些基础内容,当然关于fs模块的内容不止这些,还有其他结合buffer的一些内容,比如还有一些读写fs.read() 和fs.write() 等的一些方法!在后续的内容相继来讲!