首页 > 技术文章 > Node.js文件系统

lone5wolf 2022-01-21 21:00 原文

Node.js文件系统

(fs模块的使用)

Node实现文件I/O使用标准的POSIX函数的简单包装。Node文件系统(FS--FileSystem)模块可以使用以下语法输入:

var fs = require("fs")

一、同步和异步

    所有文件系统操作都具有同步和异步形式。供开发者选择

异步的形式总是将完成回调作为其最后一个参数。传给完成回调的参数取决于具体方法,但第一个参数始终预留用于异常。如果操作成功完成,则第一个参数是null或undefined。

二、什么是回调?

   所谓“回调”,就是”回头再调”。回调函数并不是马上调用,而是需要等到事件触发了以后再执行。回调是一个异步等效的功能,在完成特定任务后回调函数被调用。

三、FS模块的常用函数:

  1、读文件

(1)readFile():用于异步读取数据。  - - - - 非阻塞方式读

fs.readFile(fileName, function (err, buffer) {

  if (err) throw err;

   process(buffer);

});

readFile方法的第一个参数是文件的路径,可以是绝对路径,也可以是相对路径。注意,如果是相对路径,是相对于当前进程所在的路径(process.cwd()),而不是相对于当前脚本所在的路径。

readFile方法的第二个参数是读取完成后的回调函数。该函数的第一个参数是发生错误时的错误对象,第二个参数是代表文件内容的Buffer实例。

    (2)readFileSync():用于同步读取文件,返回一个字符串。- - - -阻塞方式

var text = fs.readFileSync(fileName, 'utf8');

readFileSync方法的第一个参数是文件路径,第二个参数可以是一个表示配置的对象,也可以是一个表示文本文件编码的字符串。默认的配置对象是{ encoding: null, flag: 'r' },即文件编码默认为null,读取模式默认为r(只读)。如果第二个参数不指定编码(encoding),readFileSync方法返回一个Buffer实例,否则返回的是一个字符串。

 示例:创建一个名为input.txt的文件(内容自定)

var fs = require("fs");

 

// 异步读

fs.readFile('input.txt', function (err, data) {

   if (err) {

       return console.error(err);

   }

   console.log("异步读: " + data.toString());

});

console.log("Program Ended");

      

// 同步读

var data = fs.readFileSync('input.txt');

console.log("同步读: " + data.toString());

console.log("Program Ended");

这两个例子说明非阻塞阻塞调用的概念。

第一个例子(异步读-非阻塞)程序不等待文件读取,它只是进行打印“Program Ended”,同时程序无阻塞继续读取文件

第二个例子(同步读-阻塞)直到它读取该文件,然后前进到结束程序的地方。

    2、打开一个文件在异步模式下打开文件的语法

 

           fs.open(path, flags[, mode], callback)

  参数的说明:

path - 文件名,包括路径字符串

flags - 标志要打开的文件的方式。

mode - 设置文件模式,但前提是已创建该文件。它默认为0666,读取和写入。

callback - 这是回调函数,有两个参数(err, fd)。 

flags参数的取值:

 

  示例:

var fs = require("fs");

// 异步 - 打开文件

console.log("Going to open file!");

fs.open('input.txt', 'r+', function(err, fd) {

   if (err) {

       return console.error(err);

   }

  console.log("File opened successfully!");     

});

3、获取文件信息:它产生一个对象,该对象包含了该文件或目录的具体信息。通过该方法,判断正在处理的是一个文件,还是一个目录。

              fs.stat(path, callback)

参数的说明:

path - 文件名,包括路径字符串。

callback - 回调函数得到两个参数(err, stats) 。

   示例:

var fs = require("fs");

console.log("Going to get file info!");

fs.stat('input.txt', function (err, stats) {

   if (err) {

       return console.error(err);

   }

   console.log(stats);

   console.log("Got file info successfully!");

   

   // Check file type

   console.log("isFile ? " + stats.isFile());

   console.log("isDirectory ? " + stats.isDirectory());    

});

 

     4、写入文件

       (1)writeFile  --- 异步写入文件

            fs.writeFile(filename, data[, options], callback)

           如果文件已经存在将会覆盖文件

      参数的说明:

filename - 文件名,包括路径字符串

data - 字符串或缓冲区将被写入到文件中

options - 一个对象,用于指定编码格式。默认编码是UTF8。

callback - 回调函数获取一个参数err,用于在发生任何写入错误时返回错误。

示例:

var fs = require("fs");

console.log("Going to write into existing file");

fs.writeFile('input.txt', 'Simply Easy Learning!',  function(err) {

   if (err) {

       return console.error(err);

   }

   console.log("Data written successfully!");

   console.log("Let's read newly written data");

   fs.readFile('input.txt', function (err, data) {

      if (err) {

         return console.error(err);

      }

      console.log("Asynchronous read: " + data.toString());

   });

});

    (2)writeFileSync:同步写入文件

fs.writeFileSync(fileName, str, 'utf8');

 

  5、读取文件 --- 二进制方式(按字节读取)

fs.read(fd, buffer, offset, length, position, callback)

    参数的说明:

fd - 通过文件fs.open()方法返回的文件描述符

buffer - 被写入数据的缓冲区

offset - 偏移量,开始写入缓冲区的位置

length - 整数,指定要读取的字节数

position - 整数,指定从文件中开始读取。如果位置为null,数据将从当前文件位置读取。

callback - 回调函数获取三个参数,(err, bytesRead, buffer).

示例:

   var fs = require("fs");

var buf = new Buffer(1024);

 

console.log("Going to open an existing file");

fs.open('input.txt', 'r+', function(err, fd) {

   if (err) {

       return console.error(err);

   }

   console.log("File opened successfully!");

   console.log("Going to read the file");

   fs.read(fd, buf, 0, buf.length, 0, function(err, bytes){

      if (err){

         console.log(err);

      }

      console.log(bytes + " bytes read");

      

      // Print only read bytes to avoid junk.

      if(bytes > 0){

         console.log(buf.slice(0, bytes).toString());

      }

   });

});

 

  6、关闭文件

fs.close(fd, callback)

参数的说明:

fd - 这是通过文件fs.open()方法返回的文件描述符。

callback - 这是回调函数

 示例:

var fs = require("fs");

var buf = new Buffer(1024);

 

console.log("Going to open an existing file");

fs.open('input.txt', 'r+', function(err, fd) {

   if (err) {

       return console.error(err);

   }

   console.log("File opened successfully!");

   console.log("Going to read the file");

   fs.read(fd, buf, 0, buf.length, 0, function(err, bytes){

      if (err){

         console.log(err);

      }

      // Print only read bytes to avoid junk.

      if(bytes > 0){

         console.log(buf.slice(0, bytes).toString());

      }

      // Close the opened file.

      fs.close(fd, function(err){

         if (err){

            console.log(err);

         } 

         console.log("File closed successfully.");

      });

   });

});

 

7、创建目录

fs.mkdir(path[, mode], callback)

参数说明:

path - 包括路径的目录名。

mode - 要设置的目录权限。

callback - 回调函数

var fs = require("fs");

console.log("Going to create directory /tmp/test");

fs.mkdir('./tmp',function(err){

   if (err) {

       return console.error(err);

   }

   console.log("Directory created successfully!");

});

 

   8、读取目录

fs.readdir(path, callback)

参数说明:

path - 包括路径的目录名

callback - 回调函数,两个参数(err, files),其中文件的文件名的目录中的数组排除 '.' 和  '..'

   示例:

var fs = require("fs");

console.log("Going to read directory");

fs.readdir("../buffer",function(err, files){

   if (err) {

       return console.error(err);

   }

   files.forEach( function (file){

       console.log( file );

   });

});

 

9、删除目录

fs.rmdir(path, callback)

参数说明:

path - 包括路径的目录名。

callback - 回调函数

示例:

 var fs = require("fs");

console.log("Going to delete directory");

fs.rmdir("../buffer/a1",function(err){

   if (err) {

       return console.error(err);

   }

   console.log("Going to read directory");

   fs.readdir("../buffer",function(err, files){

      if (err) {

          return console.error(err);

      }

      files.forEach( function (file){

          console.log( file );

      });

   });

});

 

 10、文件复制:

             fs.copyFile(源文件,目标文件,回调函数)

   fs.copyFile('e:/demo.txt','../buffer/deyun/dd.txt',(err)=>{

    if(err){

        return console.log(err)

    }

    console.log('文件复制成功')

})

 

11、给文件中追加内容:将内容添加到文件的末尾,若给定的文件不存在则创建文件,创建的新文件名就是给定的文件名

          fs.appendFile(filename,content,callback)

      filename:文件名(含路径)

      content:内容

      callback回调函数

fs.appendFile('../buffer/deyun/dd.txt','身体健康!',(err)=>{

    if(err){

        return console.log(err)

    }

    console.log('追加内容成功')

})

 

  12、删除文件

fs.unlink(path, callback)

参数说明

path - 文件路径。

callback - 回调函数,没有参数。

var fs = require("fs");

var filename = '../buffer/aa.txt';

fs.unlink(filename, function(err) {

   if (err) {

       return console.log('删除失败');

   }

   console.log("删除成功");

});

 13、重命名

      fs.rename(oldPath, newPath, callback)

参数说明

oldPath <String> | <Buffer>

newPath <String> | <Buffer>

callback <Function> 回调只有一个可能的异常参数

var fs = require("fs");

var filename = '../buffer/aa.txt';

fs.rename(filename,'../buffer/bb.txt',function(err){

    console.log(err);

})

 

推荐阅读