文件操作

fs 模块中还提供了很多其他的文件操作方法,这些方法同样有同步方法和异步方法之分(同步方法名称是在异步方法名称后面加 Sync 后缀),但由于对文件操作时,通常都采用默认的异步方法,因此本节中主要以异步方法为例讲解文件的常见操作,主要包括截断文件、删除文件、复制文件和重命名文件。

截断文件

fs 模块中,可以使用 truncate() 方法对文件进行截断操作,所谓截断,是指删除文件内的一部分内容,以改变文件的大小。其语法格式如下:

fs.truncate(path[, len], callback)
  • path:用于指定要被截断文件的完整文件路径及文件名。

  • len:一个整数数值,用于指定被截断后的文件大小(以字节为单位)。

  • callback:用于指定截断文件操作完毕时执行的回调函数,该回调函数中使用一个参数,参数值为截断文件操作失败时触发的错误对象。

len0 时,说明文件的内容为空。

【例7.4】修改文本文件的大小。(实例位置:资源包\源码\07\04)

WebStorm 中创建项目文件夹,并在该项目文件夹中添加一个 poems.txt 文本文件,文本文件的原始内容为古诗《春夜喜雨》;然后创建一个 js.js 文件,该文件中首先使用 stat() 方法获取文件的原大小,然后使用 truncate() 方法将文件的大小截断为 140 字节,最后再次获取文件的大小,代码如下:

var fs = require('fs');
fs.stat("poems.txt",function(err,stats){
     console.log("原文件大小为:"+stats.size+"字节")
})
fs.truncate('poems.txt', 140, function (err) {
     if (err) console.log('对文件进行截断操作失败。');
     else {
          fs.stat('poems.txt', function (err, stats) {
               console.log('截断操作已完成\n文件大小为:' + stats.size + '字节。');
          });
     }
});

poems.txt 文本文件原始内容如图7.9所示,运行程序,效果如图7.10所示,然后再次打开 poems.txt 文件,可看到文件内容被更改,更改后的内容如图7.11所示。

image 2024 04 11 20 30 01 177
Figure 1. 图7.9 poems.txt 文件中的原内容
image 2024 04 11 20 30 41 021
Figure 2. 图7.10 控制台运行结果
image 2024 04 11 20 31 05 488
Figure 3. 图7.11 更改后的文件内容

删除文件

fs 模块中,可以使用 unlink() 方法对文件进行删除操作,其语法格式如下:

fs.unlink(path, callback)
  • path:用于指定被删除文件的路径。

  • callback:回调函数。

【例7.5】删除指定被路径下的文本文件。(实例位置:资源包\源码\07\05)

WebStorm 中创建项目文件夹,并在其中添加一个 poems.txt 文本文件,然后创建一个 js.js 文件,在该文件中使用 fs 模块的 unlink() 方法删除 poems.txt 文件。代码如下:

//引入模块
var fs = require("fs");
console.log("准备删除文件!");
fs.unlink('poems.txt', function (err) {
     if (err) {
          console.error(err);
     }
     console.log("文件删除成功!");
});

运行程序,即可将 poems.txt 文件删除。

复制文件

文件复制有两种形式:一种是将文件从一个位置复制到另外一个位置,另一种则是从原文件中读取数据并写入一个新文件中。针对这两种形式的文件复制操作,fs 模块都提供了相应的方法来实现。另外,由于复制文件时可能会有同步操作和异步操作,因此,本节同时讲解复制文件的同步方法和异步方法。

使用copyFile()方法与copyFileSync()方法复制文件

copyFile() 方法与 copyFileSync() 方法分别用于异步和同步复制文件,它们用来将文件从一个位置复制到另外一个位置,其语法格式如下:

fs.copyFile(src, dest[, mode], callback)
fs.copyFileSync(src, dest[, mode])
  • src:要复制的源文件名。

  • dest:要复制的目标文件名。

  • mode:复制操作的修饰符,默认值为0。

  • callback:回调函数。

【例7.6】复制文件。(实例位置:资源包\源码\07\06)

WebStorm 中新建一个项目文件夹,并在该项目文件夹中添加一个 poems.txt 文件;然后新建一个 js.js 文件,在 js.js 文件中使用 fs 模块的 copyFile() 方法异步复制 poems.txt 文件,将其复制为 poems1.txt,代码如下:

var fs = require("fs")
fs.copyFile("poems.txt", "poems1.txt", function (err) {      //异步复制文件
     if (err) {
          console.log("复制文件失败")                        //提示复制失败
          console.log(err)                                   //显示错误信息
     }
     else {
          console.log("复制文件成功")                        //提示复制成功
     }
})

项目文件夹下的原始文件如图 7.12 所示,运行程序后,再次打开项目文件夹,可以看到会多出一个 poems1.txt 文件,效果如图7.13所示。

image 2024 04 11 20 40 01 057
Figure 4. 图7.12 项目文件夹中的原始文件
image 2024 04 11 20 40 26 115
Figure 5. 图7.13 复制文件后的项目文件夹中文件

使用 readFile() 和 writeFile() 方法复制文件

除了上面介绍的直接复制文件的方式,还可以通过复制文件内容的方式实现文件的复制,这需要使用 fs 模块中的 readFile() 方法和 writeFile() 方法。其中,readFile() 方法用来读取要复制的文件内容,writeFile() 方法用来将读取到的文件内容写入新建的文件中,从而实现复制文件的功能。例如,使用 readFile()writeFile() 方法实现例 7.6 的功能,代码如下:

var fs = require("fs")
//读取文件
fs.readFile("poems.txt", "utf8", function (err, data) {
     if (err) {
          console.log("读取文件失败")
          console.log(err)
     }
     else {
          console.log("读取文件成功")
          //写入文件
          fs.writeFile("poems1.txt", data, function (err) {
               if (err) {
                     console.log("写入文件失败")
                     console.log(err)
               }
           else {
                 console.log("写入文件成功")
           }
       })
    }
})

上面使用了 readFile()writeFile() 方法实现了文件的异步复制。同样,我们可以使用 readFileSync()writeFileSync() 方法实现文件的同步复制,它们的使用方式与异步复制中的方法的使用方式类似。

重命名文件

fs 模块中,可以使用 rename() 方法为文件重命名,重命名文件的同时会更改文件的路径,其语法格式如下:

fs.rename(oldPath, newPath, callback)
  • oldPath:原文件名(目录名)。

  • newPath:新文件名(目录名)。

  • callback:回调函数。

例如,下面代码可以将文件 poems.txt 重命名为 “春夜喜雨.txt”:

fs=require("fs")
fs.rename("poems.txt", "春夜喜雨.txt", function(err){
     if(err){
          console.log("糟糕!重命名文件失败")
          console.log(err)
     }
     else{
          console.log("重命名文件成功")
     }
})

【例7.7】批量重命名文件。(实例位置:资源包\源码\07\07)

WebStorm 中新建一个项目文件夹,并在该项目文件夹中添加一个 demo 文件夹,其中包含以 poems 为前缀的多个文本文件,文件中的内容为不同的古诗;然后新建一个 .js 文件,该文件中使用 for 循环依次读取 demo 文件夹中所有文本文件的内容,并且将每个文本文件内容的第一行(古诗的标题)去掉所有空白字符(包括空格和换行符等),作为文本文件的新文件名。代码如下:

fs = require("fs")
//读取demo文件夹中的文件名
fs.readdir("demo", (err,files) =>  {
     for (var i = 0; i < files.length; i++) {                          //遍历文件夹中的文件
       fl = "demo\\" + files[i]                                          //记录要重命名的文件名(包括路径)
       //读取文件,并将文件中的内容以换行符进行分割存储到数组中
       var data = fs.readFileSync(fl, "utf8").split("\n")
       //获取文件中第一行内容并去掉所有空白字符(包括空格和换行符等)
       var title = data[0].replace(/\s*/g, '')
       fs.rename(fl, "demo\\" + title + ".txt",function (err) {        // 重命名文件
            // if(err)
            //     console.error(err.message)
       })
    }
})

运行程序前的文件名如图 7.14 所示,运行程序后的文件名如图 7.15 所示。

image 2024 04 11 20 46 57 553
Figure 6. 图7.14 运行程序前的文件名
image 2024 04 11 20 47 21 977
Figure 7. 图7.15 运行程序后的文件名