File System 文件系统模块

时间:2022-09-05 16:03:53


  该模块是核心模块,使用需要用require导入后使用。
  在这篇文章中,我主要介绍一些File System的一些方法和使用。
  当然,在node官网中也有相对应的api文档,更加详细的可以查阅官网。
  api路径为:http://nodejs.cn/doc/node/fs.html


一:fs.open 和 fs.openSync

    1、fs.open(path, flags, [mode], callback);//异步打开一个文件

          对应参数:
                 path:要打开的文件路径
                 flags:打开文件的方式,(读/写)
                 [mode]:设置文件的读写模式 读/写/执行 4/2/1(这个参数在windows系统下是没有什么区别的)
                 callback:回调
                                 err:文件打开失败的错误保存在err中,如果成功err为Null
                                 fd:被打开文件的标识
        在这里,详细介绍一下flags值的多种形式的意思:
                'r' -   以读取模式打开文件,文件不存在时会抛出异常
                'r+' - 以读写模式打开文件,文件不存在时抛出异常
                'rs' - 使用同步模式打开并读取文件。指示操作系统忽略本地文件系统缓存
               'rs+' - 以同步的方式打开,读取 并 写入文件
               注意:这不是让fs.open变成同步模式的阻塞操作。如果想要同步模式请使用fs.openSync
                'w' - 以读取模式打开文件,如果文件不存在则创建
                'wx' - 和 ' w ' 模式一样,但是文件存在则返回失败
                'w+' - 以读写模式打开文件,如果文件不存在则创建,文件存在时,原有文件会被全部清空,再进行写入动                 作
                'wx+' - 和 ' w+ ' 模式一样,但是文件存在则返回失败

                'a' - 以追加模式打开文件,如果文件不存在则创建
                'ax' - 和 ' a ' 模式一样,但是文件存在则返回失败
                'a+' - 以读取追加模式打开文件,如果文件不存在则创建
               'ax+' - 和 ' a+ ' 模式一样,但是文件存在则返回失败


var fs = require('fs');
fs.open('test.js','r',function(err,fd){


    if(err){
        console.log("文件打开失败");
    }else{
        console.log("文件打开成功");
        console.log(fd);
    }
});


     2、fs.openSync(path, flags ,[mode]) ; //同步打开一个文件 返回值为fd

var fs = require('fs');
var fd = fs.openSync('test.js','r');
console.log("同步方式:"+fd);


二:fs.readFile 和 fs.readFileSync

    1、fs.readFile(file[, options], callback); //异步读取一个文件

    2、fs.readFileSync(file[, options])同步读取一个文件

         这两个方法我就不在这里详细讲解了,在我另一篇文章中有重点介绍着两个方法的使用和区别。
         node中的文件读取---fs和path


三:fs.write 和 fs.writeSync

    1、fs.write(fd, buffer, offset, length, [position], callback); //异步通过文件的标识fd,向制定的文件中写入               buffer

          fs.write方法中各个参数的意思:
               fd
               buffer:要写入的数据
               offset:偏移量(buffer对象中要写入数据的偏移起始位置)
               length:写入buffer数据的长度
               position :fd的起始位置
               callback:回调

var fs = require('fs');
fs.open('3.txt','w+',function(err,fd){


    if(err){
        console.log("文件打开失败");
    }else{
        console.log("文件打开成功");
        console.log(fd);
        var buffer = new Buffer('abc');
        fs.write(fd,buffer,0,3,10,function(){
        });
        fs.close(fd,function(){

        });
    }
});


   2、fs.write(fd, data, [position], [encoding], callback); //以字符串形式写文件

          把data通过指定fd写入到文档中,如果对象不是buffer对象的实例,则会把值强制转换为一个字符串。

var fs = require('fs');
fs.write(fd,'1234',5,'utf-8',function(){});

   3、fs.writeSync(fd, buffer, offset, length, [position]); // 同步写入文件

           注意:同步类型的函数都是没有回调函数的。
   

   三、fs.close 和 fs.closeSync 

       1、fs.close(fd, callback) ; //异步关闭一个文件

            关闭一个打开的文件(打开一个文件,操作完成之后完成之后最好及时的关掉该文件)。

       2、fs.closeSync(fd);  //同步关闭一个文件

  四:fs.writeFile 和fs.writeFileSync

       1、fs.writeFile(file, data, [options], callback); //异步的将数据写入一个文件

            如果文件不存在则创建,如果文件原先存在,原先的内容则会被替换。data是一个String,也可以是一个原生               buffer。存入的数据会覆盖原来文件的内容。但是在使用fs.writeFile这个方法,在没有等到回调又再次使用这               个 方法的情况,是不安全的。
var fs = require('fs');
var fileName = "1.txt";
fs.writeFile(fileName,"hello",function(err){
	     if(err){
               console.log('出错了');
	     }else{
	       console.log('创建成功');
	     }
	  });


       2、fs.writeFileSync(file, data, [options]); // 同步的将数据写入一个文件

                     
var fs = require('fs');
var fileName = "1.txt";
fs.writeFile(fileName,"hello");


 五:fs.appendFile 和 fs.appendFileSync

     1、fs.appendFile(file, data, [options], callback); //异步的将数据添加到文件的尾部

                 如果文件不存在则创建,如果文件原先存在,则会被替换。data是一个String,也可以是一个原生buffer。
          

var fs = require('fs');
var fileName = "1.txt";
fs.appendFile(fileName,'-eee',function(err){
	     if(err){
                console.log('出错了');
	     }elsr{
	        console.log('添加成功');
	     }
	 });

     2、fs.appendFileSync(file, data, [options]); //同步的将数据添加到文件的尾部

var fs = require('fs');
var fileName = "1.txt";
fs.appendFile(fileName,'-eee');


  六:fs.exists 和 fs.existsSync

      1、fs.exists(path, callback);  //异步的判断文件是否存在

          该方法检查指定路径的文件或者目录是否存在。

          其实最好的办法就是fs.open的方法,根据回调函数返回来的值来判断文件是否存在。
          

var fs = require('fs');
var fileName = "1.txt";
if(fs.existsSync(fileName)){
	if(fs.writeFileSync(fileName,"hello")){
       console.log('出错了');
	}else{
       console.log('创建成功');
	}
}else{
	if(fs.appendFile(fileName,'-eee'){
		if(err){
			console.log('出错了');
		}else{
			console.log('添加成功');
		}
	}
}




          其实上面这部分代码可以用fs.appendFile这个方法就可以实现这个功能了。

      2、fs.existsSync(path);  //同步的判断文件是否存在

  七:fs.link 和 fs.linkSync

      1、fs.link(srcpath, dstpath, callback); //异步方式删除一个文档
     2、fs.linkSync(srcpath, dstpath); /同步方式删除一个文档

var fs = require('fs');
var fileName = "1.txt";
fs.unlink(fileName,function(err){
	if(err){
		console.log('删除失败');
	}else{
		console.log('删除成功');
	}
});


  八:fs.rename 和 fs.renameSync

      1、fs.rename(oldPath, newPath, callback); //异步方式对文件进行重命名

var fs = require('fs');
var fileName = "1.txt";
fs.rename(fileName,'2-new.txt',function(){
	console.log(arguments);
});


      2、fs.renameSync(oldPath, newPath); //同步方式对文件进行重命名

  九:fs.stat 和 fs.statSync

      1、fs.stat(path, callback) ;   // 异步方式读取文件状态信息

var fs = require('fs');
var fileName = "1.txt";
fs.stat(fileName,function(){
	console.log(arguments);
});


      2、fs.statSync(path); //同步方式读取文件状态信息

  
十:fs.watch  

     1、 fs.watch(filename [,options], [listener]); // 观察路径的变化,可以是文档或者目录

               这个方法不稳定,不同的版本会有调整。
               该功能依赖于操作系统底层提供的方法来监视文件系统的变化。
fs.watch(fileName,function(ev,fn){
	//ev:当前事件
	//fn:当前监听的文件
	console.log(ev);
	if(fn){
		console.log(fn:"发生了变化");
	}else{
		console.log("...");
	}

});


 十一:fs.mkdir 和 fs.mkdirSync

        1、fs.mkdir(path, [mode], callback); // 异步创建文件夹


在当前目录下创建一个名为‘1’的文件夹

var fs = require('fs');

fs.mkdir('./1',function(){
    console.log(arguments);
});


        2、fs.mkdirSync(path, [mode]); //同步创建文件夹

十二:fs.readdir 和 fs.readdirSync

       1、fs.readdir(path, callback);  //异步读取文件夹


var fs = require('fs');
fs.readdir('../node',function(err,fileList){
    console.log(fileList);
});
以下代码来读取上层node目录下的全部文件(包括文件夹),执行结果如下 
File System 文件系统模块


    现在我们来完善一下代码,来明确出哪些是文件夹,哪些是文件。

var fs = require('fs');
fs.readdir('../node',function(err,fileList){
    //console.log(fileList);
    fileList.forEach(function(f){
        fs.stat(f,function(e,info){
            switch (info.mode){
                case 16822:
                    console.log('[文件夹] '+ f);
                    break;
                case 33206:
                    console.log('[文件] '+ f);
                    break;
            }
        });
    });
});
 

   执行结果为:

   File System 文件系统模块


       2、fs.readdirSync(path);  //同步读取文件夹

十三:

       1、fs.rmdir(path, callback); // 异步删除文件夹

var fs = require('fs');
fs.rmdir('./1',function(){
    console.log(arguments);
});


       2、fs.rmdirSync(path);  //同步删除文件夹