Node.js--文件系统

Node.js 文件系统

Node.js 提供一组类似 UNIX(POSIX)标准的文件操作API。 Node 导入文件系统模块(fs)语法如下所示:

var fs = require('fs')
var os = require('os')

异步和同步

Node.js 文件系统(fs 模块)模块中的方法均有异步和同步版本,例如读取文件内容的函数有异步的 fs.readFile()同步的 fs.readFileSync()

异步的方法函数最后一个参数为回调函数,回调函数的第一个参数包含了错误信息(error)。

var data = fs.readFile('./demo.txt',function(err,data){
    if(err) throw err //如果出错 即err存在  直接用throw err抛出异常
    console.log(data.toString());
})

建议大家使用异步方法,比起同步,异步方法性能更高,速度更快,而且没有阻塞。

详细代码如下
创建demo.txt文件 输入内容abc
Node.js--文件系统_第1张图片

创建index.js文件

//引入模块
var fs =require('fs')

//同步读取文件
console.log('start....');
var data=fs.readFileSync('./demo.txt')
console.log(data.toString());
console.log('end...');



console.log('start....');
var data = fs.readFile('./demo.txt',function(err,data){
    if(err) throw err //如果出错 即err存在  直接用throw err抛出异常
    console.log(data.toString());
})
console.log('end...');

在控制台输入node index.js 输出如下图
Node.js--文件系统_第2张图片


接下来,让我们来具体了解下 Node.js 文件系统的方法。

打开文件

语法

以下为在异步模式下打开文件的语法格式:

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

参数使用说明如下:

  • path - 文件的路径
  • flags - 文件打开的行为。具体值详见下文。
  • mode - 设置文件模式(权限),文件创建默认权限为 0666(可读,可写)。
  • callback - 回调函数,带有两个参数如:callback(err, fd)。

flags 参数可以是以下值:

Flag 描述
r 以读取模式打开文件。如果文件不存在抛出异常
r+ 以读写模式打开文件。如果文件不存在抛出异常。
rs 以同步的方式读取文件
rs+ 以同步的方式读取和写入文件
w 以写入模式打开文件 如果文件不存在则进行创建
wx 类似于w 但是如果文件路径存在 则文件写入会失败
w+ 以读写模式打开文件 文件不存在则创建
wx+ 类似于w+ 如果文件路径存在 则文件读写失败
a 以追加模式打开文件,如果文件不存在则创建。
ax 类似 ‘a’, 但是如果文件路径存在,则文件追加失败。
a+ 以读取追加模式打开文件,如果文件不存在则创建。
ax+ 类似 ‘a+’, 但是如果文件路径存在,则文件读取追加失败。

具体实例代码如下
创建一个file.js文件 一个input.txt文件

var fs = require("fs")
console.log("准备打开文件啦!");
fs.open('input.txt','r+',function(err,fd){
    if(err){
        throw err;
    }
    console.log("文件打开成功啦!!");
})

执行结果如下图
在这里插入图片描述


获取文件信息

语法

以下为通过异步模式获取文件信息的语法格式:

fs.stat(path, callback)
参数

参数使用说明如下:

  • path - 文件路径。

  • callback - 回调函数,带有两个参数如:(err, stats), stats 是 fs.Stats 对象。

fs.stat(path)执行后,会将stats类的实例返回给其回调函数。可以通过stats类中的提供方法判断文件的相关属性。例如判断是否为文件:

var fs = require('fs');

fs.stat('/Users/liuht/code/itbilu/demo/fs.js', function (err, stats) {
    console.log(stats.isFile());         //true
})
方法 描述
stats.isFile() 如果是文件返回 true,否则返回 false。
stats.isDirectory() 如果是目录返回 true,否则返回 false。
stats.isBlockDevice() 如果是块设备返回 true,否则返回 false。
stats.isCharacterDevice() 如果是字符设备返回 true,否则返回 false。
stats.isSymbolicLink() 如果是软链接返回 true,否则返回 false。
stats.isFIFO() 如果是FIFO,返回true,否则返回 false。FIFO是UNIX中的一种特殊类型的命令管道。
stats.isSocket() 如果是 Socket 返回 true,否则返回 false。
实例

接下来我们创建 file.js 文件,代码如下所示:

var fs = require("fs");

console.log("准备打开文件!");
fs.stat('input.txt', function (err, stats) {
   if (err) {
       return console.error(err);
   }
   console.log(stats);
   console.log("读取文件信息成功!");
   
   // 检测文件类型
   console.log("是否为文件(isFile) ? " + stats.isFile());
   console.log("是否为目录(isDirectory) ? " + stats.isDirectory());    
});

执行结果如下

$ node file.js 
准备打开文件!
{ dev: 16777220,
  mode: 33188,
  nlink: 1,
  uid: 501,
  gid: 20,
  rdev: 0,
  blksize: 4096,
  ino: 40333161,
  size: 61,
  blocks: 8,
  atime: Mon Sep 07 2015 17:43:55 GMT+0800 (CST),
  mtime: Mon Sep 07 2015 17:22:35 GMT+0800 (CST),
  ctime: Mon Sep 07 2015 17:22:35 GMT+0800 (CST) }
读取文件信息成功!
是否为文件(isFile) ? true
是否为目录(isDirectory) ? false

写入文件

语法

以下为异步模式下写入文件的语法格式:

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

writeFile 直接打开文件默认是 w 模式,所以如果文件存在,该方法写入的内容会覆盖旧的文件内容。 如果文件不存在 默认的w模式下会进行创建该文件并写入内容

参数

参数使用说明如下:

  • file - 文件名或文件描述符。

  • data - 要写入文件的数据,可以是 String(字符串) 或 Buffer(缓冲) 对象。

  • options - 该参数是一个对象,包含 {encoding, mode, flag}。默认编码为 utf8, 模式为 0666 , flag 为 ‘w’

  • callback - 回调函数,回调函数只包含错误信息参数(err),在写入失败时返回。

实例

接下来我们创建 write.js 文件,代码如下所示:

var fs = require("fs");

console.log("准备写入文件");
fs.writeFile('input.txt', '我是通 过fs.writeFile 写入文件的内容',  function(err) {
   if (err) {
       throw err;
   }
   console.log("数据写入成功!");
   console.log("--------我是分割线-------------")
   console.log("读取写入的数据!");
   fs.readFile('input.txt', function (err, data) {
      if (err) {
         return console.error(err);
      }
      console.log("异步读取文件数据: " + data.toString());
   });
});

执行结果如下
Node.js--文件系统_第3张图片


读取文件

语法

以下为异步模式下读取文件的语法格式:

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

该方法使用了文件描述符来读取文件。

参数

参数使用说明如下:

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

  • buffer - 数据写入的缓冲区。

  • offset - 缓冲区写入的写入偏移量。

  • length - 要从文件中读取的字节数。

  • position - 文件读取的起始位置,如果 position 的值为 null,则会从当前文件指针的位置读取。

  • callback - 回调函数,有三个参数err, bytesRead, buffer,err 为错误信息, bytesRead 表示读取的字节数,buffer 为缓冲区对象。

实例

input.txt 文件内容为:

我是通 过fs.writeFile 写入文件的内容

接下来我们创建 read.js 文件,代码如下所示:

var fs = require("fs");
var buf = new Buffer.alloc(1024);

console.log("准备打开已存在的文件!");
fs.open('input.txt', 'r+', function(err, fd) {
   if (err) {
       return console.error(err);
   }
   console.log("文件打开成功!");
   console.log("准备读取文件:");
   fs.read(fd, buf, 0, buf.length, 0, function(err, bytes){
      if (err){
         console.log(err);
      }
      console.log(bytes + "  字节被读取");
      
      // 仅输出读取的字节
      if(bytes > 0){
         console.log(buf.slice(0, bytes).toString());
      }
   });
});

执行结果如下
Node.js--文件系统_第4张图片


关闭文件

语法

以下为异步模式下关闭文件的语法格式:

fs.close(fd, callback)

该方法使用了文件描述符来读取文件。

参数

参数使用说明如下:

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

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

实例

input.txt 文件内容为:

我是通 过fs.writeFile 写入文件的内容

创建close.js代码

var fs = require("fs");
var buf = new Buffer.alloc(1024);

console.log("准备打开文件!");
fs.open('input.txt', 'r+', function(err, fd) {
   if (err) {
       return console.error(err);
   }
   console.log("文件打开成功!");
   console.log("准备读取文件!");
   fs.read(fd, buf, 0, buf.length, 0, function(err, bytes){
      if (err){
         console.log(err);
      }

      // 仅输出读取的字节
      if(bytes > 0){
         console.log(buf.slice(0, bytes).toString());
      }

      // 关闭文件
      fs.close(fd, function(err){
         if (err){
            console.log(err);
         } 
         console.log("文件关闭成功");
      });
   });
});

执行结果如下
Node.js--文件系统_第5张图片


截取文件

语法

以下为异步模式下截取文件的语法格式:

fs.ftruncate(fd, len, callback)

该方法使用了文件描述符来读取文件。

参数

参数使用说明如下:

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

  • len - 文件内容截取的长度。

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

实例

input.txt 文件内容为:

我是通 过fs.writeFile 写入文件的内容

接下来我们创建 ftruncate.js 文件,代码如下所示:

var fs = require("fs");
var buf = new Buffer.alloc(1024);

console.log("准备打开文件!");
fs.open('input.txt', 'r+', function(err, fd) {
   if (err) {
       return console.error(err);
   }
   console.log("文件打开成功!");
   console.log("截取10字节内的文件内容,超出部分将被去除。");
   fs.read(fd,buf,0,buf.length,0,function(err,bytes){
    if(err){
        throw err
    }
    console.log(bytes+"个字节被读取");

    //输出读取到的字节
    if(bytes>0){
        console.log(buf.slice(0,bytes).toString());
        //输出数据写入的缓冲区内的数据,截取0到bytes个字符 并转为
    }
   })

   
   // 截取文件
   fs.ftruncate(fd, 10, function(err){
      if (err){
         console.log(err);
      } 
      console.log("文件截取成功。");
      console.log("读取相同的文件"); 
      fs.read(fd, buf, 0, buf.length, 0, function(err, bytes){
         if (err){
            console.log(err);
         }

         // 仅输出读取的字节
         if(bytes > 0){
            console.log(buf.slice(0, bytes).toString());
         }

         // 关闭文件
         fs.close(fd, function(err){
            if (err){
               console.log(err);
            } 
            console.log("文件关闭成功!");
         });
      });
   });
});

以上代码执行结果如下:

Node.js--文件系统_第6张图片


删除文件

语法

以下为删除文件的语法格式:

fs.unlink(path, callback)
参数

参数使用说明如下:

  • path - 文件路径。

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

实例

input.txt 文件内容为:

我是玛卡巴卡的囍囍丸子

接下来我们创建 unlink.js 文件,代码如下所示:

var fs = require("fs");
var buf = new Buffer.alloc(1024);
console.log("我们先打开并读取一下文件 刚学的不太熟  练练手 这几步都没必要  包括开头的那个var buf 也没必要");
fs.open('inputt.txt','r+',function(err,fd){
    if(err){
        throw err
    }
    console.log("文件打开成功 准备读取");
    fs.read(fd,buf,0,buf.length,0,function(err,bytes){
        if(err){
            throw err
        }
        console.log(bytes+"个字节被读取");

        //输出的是当前读取到的字节
        if(bytes>0){
            console.log(buf.slice(0,bytes).toString());
        }
    })
  

})

    

fs.unlink('inputt.txt', function(err) {
    if (err) {
      return console.error(err);
    }
     console.log("文件删除成功!");
   });

以上代码执行结果如下:
因为是异步模式 所以输出顺序有点不对
应该是先读取 输出一下要删除的文件内容
然后执行删除操作 输出删除成功
在这里插入图片描述

再去查看 input.txt 文件,发现已经不存在了。


创建目录

语法

以下为创建目录的语法格式:

fs.mkdir(path[, options], callback)
参数

参数使用说明如下:

  • path - 文件路径。

  • options 参数可以是:
    recursive - 是否以递归的方式创建目录,默认为 false。
    mode - 设置目录权限,默认为 0777。

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

实例

接下来我们创建mkdir.js 文件,代码如下所示:

var fs = require(“fs”);
// tmp 目录必须存在

var fs = require("fs");
// tmp 目录必须存在
console.log("创建目录 /tmp/aaa/");
fs.mkdir("/tmp/aaa/",function(err){
   if (err) {
       return console.error(err);
   }
   console.log("目录创建成功。");
});
//默认在盘符根目录下进行创建
//如 我是在d盘运行这个文件  它就在d盘根目录下的tmp文件夹里边创建一个aaa文件夹

以上代码执行结果如下:

在这里插入图片描述

可以添加 recursive: true 参数,不管创建的目录 /tmp 和 /tmp/a 是否存在:

fs.mkdir('/tmp/a/apple', { recursive: true }, (err) => {
  if (err) throw err;
});

读取目录

语法

以下为读取目录的语法格式:

fs.readdir(path, callback)
参数

参数使用说明如下:

path - 文件路径。

  • callback - 回调函数,回调函数带有两个参数err, files,err 为错误信息,files 为 目录下的文件数组列表。
实例

接下来我们创建 readdir.js 文件,代码如下所示:

var fs = require("fs");

console.log("查看 /tmp 目录");
fs.readdir("/tmp/",function(err, files){
   if (err) {
       return console.error(err);
   }
   files.forEach( function (file){
       console.log( file );
   });
});

以上代码执行结果如下:

在这里插入图片描述


删除目录

语法

以下为删除目录的语法格式:

fs.rmdir(path, callback)
参数

参数使用说明如下:

path - 文件路径。

  • callback - 回调函数,没有参数。
实例

接下来我们创建 rmdir.js 文件,代码如下所示:

var fs = require("fs");
// 执行前创建一个空的 /tmp/aaa 目录
console.log("首次读取tmp目录的内容");
fs.readdir("/tmp/",function(err, files){
    if (err) {
        return console.error(err);
    }
    files.forEach( function (file){
        console.log( file );
    });
 });
 console.log("准备删除目录 /tmp/aaa");
fs.rmdir("/tmp/aaa",function(err){
   if (err) {
       return console.error(err);
   }
   console.log("删除成功");
   console.log("再次读取 /tmp 目录");
   fs.readdir("/tmp/",function(err, files){
      if (err) {
          return console.error(err);
      }
      files.forEach( function (file){
          console.log( file );
      });
   });
});

以上代码执行结果
Node.js--文件系统_第7张图片

……

你可能感兴趣的:(node.js,node.js)