6. 在Node.js中操作文件系统

2020-07-26  本文已影响0人  gem_Y

6.1 同步方法(xxxSync)与异步方法

image.png image.png

6.2 对文件执行读写操作

6.2.1 文件的完整读写

完整读取文件,如上例子。
fs.readFile(filename, [options], callback)

options为一个对象,
(1)该对象的flag属性可指定对文件采取什么操作,默认为'r'
'r': 读取文件,如果文件不存中则抛出异常
'r+': 读取并写入文件,如果文件不存中则抛出异常
....

(2)encoding属性用于指定使用何种编码格式来读取文件,若不指定encoding属性时,该参数值为一个存放了文件中原始二进制内容的缓存对象。


image.png
要完整写入文件,可以使用fs模块中的writeFile / writeFileSync 方法
fs.writeFile(filename,data,[options],callback)

options对象:

var fs = require('fs');
fs.writeFile('./chapter-6/message.txt','这是第一行。\r\n这是第二行。', function(err){
  if (err) {
    console.log('写入文件操作失败')
  } else {
    console.log('写入文件操作成功')
  }
})
var fs = require('fs');
var data = new Buffer('我喜爱编程')
fs.writeFile('./chapter-6/message.txt',data, function(err){
  if (err) {
    console.log('写入文件操作失败')
  } else {
    console.log('写入文件操作成功')
  }
})
// 追加数据
var fs = require('fs');
var options = {
  flag: 'a'
}
fs.writeFile('./chapter-6/message.txt','这是追加的数据',options, function(err){
  if (err) {
    console.log('写入文件操作失败')
  } else {
    console.log('写入文件操作成功')
  }
})

实现图片的复制:
读取写入文件时使用base64编码


image.png

writeFileSync:

fs.writeFileSync(filename,data,[options])
appendFile/appendFileSync

用于将数据追加到文件底部(跟writeFile一样的结果呀?!)

fs.appendFile(filename,data,[options],callback)
fs.appendFileSync(filename,data,[options])
image.png

6.2.2 从指定位置处开始读写文件

  1. 使用open方法打开应用程序根目录下的message.txt文件,并在回调函数中将fd参数值输出到控制台窗口中


    image.png
  2. 打开文件之后,可以在回调函数中使用fs模块中的read方法或readSync方法从文件的指定位置处读取文件,也可以使用fs模块中的write方法或writeSync方法从文件的指定处开始写入数据

fs.read(fd,buffer,offset,length,position,callback)
// buffer: 用于指定将文件数据读取到哪个缓存区中
//  offset: 缓存区中写入数据时的开始写入位置(以字节为单位)
//  length: 用于指定从文件中读取的字节数
// position: 指定读取文件时的开始位置(以字节为单位),如果该参数为null,将从文件的当前被读取位置处(前一次读取时的开始位置+读取字节数)开始读取文件
var bytesRead = fs.readSync(fd,buffer,offset,length,position)
image.png
image.png
fs.write(fd,buffer,offset,length,position,callback)
// offset: 指定从缓存区中读取数据时的开始读取位置(以字节为单位)
// length: 指定从缓存区中读取的字节数
// position: 指定写入文件时的开始位置(以字节为单位)
fs.writeSync(fd,buffer,offset,length,position)
image.png
  1. 在fs模块中,提供close方法与closeSync方法以关闭文件
fs.close(fd,[callback])

为了防止数据丢失,在调用close方法之前先调用fsync方法以将内存缓冲区中的数据全部书写到文件中

fs.sync(fd, [callback])

6.3 创建与读取目录

fs.mkdir(path, [mode], callback)
// mode : 指定该目录的权限,默认值为0777(表示任何人可读写该目录)
fs.mkdirSync(path, [mode])
image.png
fs.readdir(path, callback)
var files = fs.readdirSync(path)
image.png

6.4 查看与修改文件或目录的信息

6.4.1 查看文件或目录的信息

fs.stat(path, callback)
fs.lstat(path, callback) // 当查看符号链接文件的信息时,必须使用这个方法
var fs = require('fs')
fs.stat('./chapter-6/message.txt', function(err, stats){
  console.log(stats)
})

stats 是fs.Stats对象,该对象拥有如下的属性和方法

var stats = fs.statSync(path)
var stats = fs.lstatSync(path)
fs.fstat(fd, callback)
var stats = fs.fstatSync(fd)

6.4.2 检查文件或目录是否存在

fs.exists(path, callback)
var exists = fs.existsSync(path)
var fs = require('fs')
fs.exists('./msssss.txt', function(exists) {
  if (exists) {
    console.log('该文件存在')
  } else {
    console.log('该文件不存在')
  }
})

6.4.3 获取文件或目录的绝对路径

fs.realpath(path, [cache], callback)
var fs = require('fs')
var cache = {'/etc': '/private/etc'}  // path 中的 /etc 指的就是 /private/etc
fs.realpath('/etc/passwd', cache, function(err, resolvedPath) {
  if (err) {
    console.log('获取目录的绝对路径失败', err)
  } else {
    console.log('resolvedPath', resolvedPath)
  }
})
var fs = require('fs')
fs.realpath('./chapter-6/message.txt', function(err, resolvedPath) {
  if (err) {
    console.log('获取目录的绝对路径失败', err)
  } else {
    console.log('resolvedPath', resolvedPath)
  }
})
PS E:\study\NodeJS-Learning> node chapter-6.js
resolvedPath E:\study\NodeJS-Learning\chapter-6\message.txt

同步:

var resolvedPath = fs.realpathSync(path, [cache])

6.4.3 修改文件访问时间及修改时间

fs.utimes(path, atime, mtime, callback)

6.4.4 修改文件或目录的读写权限

fs.chmod(path, mode, callback)

6.5 对文件或目录执行的其他操作

6.5.1 移动文件或目录

fs.rename(oldPath, newPath, callback)
var fs = require('fs')
var files = fs.rename('./chapter-6/message.txt', './test/text.txt', function(err) {
  // test 子目录必须已经存在,否则将导致移动操作失败
  if (err) {
    console.log('移动文件操作失败', err)
  } else {
    console.log('移动文件操作成功')
  }
})
fs.renameSync(oldPath, newPath)

6.5.2 创建与删除文件的硬链接

fs.link(srcpath, dstpath, callback)
fs.linkSync(srcpath, dstpath)
var fs = require('fs')
fs.link('./chapter-6/hardlink-text.txt', './test/hardlink-dst.txt', function(err) {
  if (err) {
    console.log('创建硬链接失败')
  } else {
    console.log('创建硬链接操作成功')
  }
})

删除硬链接(在创建多个硬链接后,再删除其中任何一个硬链接,其他硬链接依然存在,但若删除的硬链接为该文件的最后一个硬链接,则事实上就是彻底删除该文件了)

fs.unlink(path, callback)
fs.unlinkSync(path)
var fs = require('fs')
fs.unlink('./chapter-6/hardlink-text.txt', function(err) {
  if (err) {
    console.log('删除硬链接失败')
  } else {
    console.log('删除硬链接操作成功')
  }
})

6.5.3 创建与查看符号链接

fs.symlink(srcpath, dstpath, [type], callback)
fs.symlinkSync(srcpath, dstpath, [type])
var fs = require('fs')
fs.symlink('./chapter-6', './symlink', 'dir', function(err) {
  if (err) {
    console.log('为目录创建符号链接操作失败', err)
  } else {
    console.log('为目录创建符号链接操作成功')
  }
})
var fs = require('fs')
fs.symlink(__dirname + '/chapter-6/symlink-src.txt', __dirname + '/symlink-dst.txt', 'file', function(err) {
  if (err) {
    console.log('为文件创建符号链接操作失败', err)
  } else {
    console.log('为文件创建符号链接操作成功')
  }
})

当直接在终端运行时候,会报错,创建符号链接失败

[Error: EPERM: operation not permitted, symlink '.\chapter-6' -> 'E:\study\NodeJS-Learning\symlink'] 

解决办法,以管理员的身份运行git,然后就成功了

fs.readlink(path, function(err, linkString) {
} )
var linkString = fs.readlinkSync(path)
var fs = require('fs')
fs.symlink(__dirname + '/chapter-6/symlink-src', __dirname + '/symlink-dst.txt', function(err, linkString){
  if (err) {
    console.log('为文件创建符号链接操作失败', err)
  } else {
    fs.readlink(__dirname + '/symlink-dst.txt', function(err, linkString) {
      if (err) {
        console.log('读取符号链接操作失败', err)
      } else {
        console.log('linkString:  ' + linkString)
      }
    })

  }
})
E:\study\NodeJS-Learning>node chapter-6.js
linkString:  E:\study\NodeJS-Learning\chapter-6\symlink-src
上一篇 下一篇

猜你喜欢

热点阅读