前言
之前把一个文件复制到另一个文件夹的时候发现,大概200MB左右的文件复制一下需要大概两三分钟(也可能是我电脑的问题),最近刚好在看node.js的内容,就试着做了一个拷贝文件的脚本。功能就是把一个文件夹下的所有目录中的内容全部拷贝到另一个文件夹中,花费时间大概20s 左右
需求分析
- 能对单个文件进行复制
- 能对整个文件夹内容进行复制
- 能选择需要拷贝的文件和拷贝后存放的位置
逻辑分析
首先拿到源文件路径和文件格式,根据文件格式判断是文件还是文件夹,如果是文件直接复制到指定路径下,如果有文件夹的话需要先在目的路径下创建一个同名文件夹,然后将其中的文件复制过去
详细设计
- 复制功能
node.js实现复制功能的api是
fsPromises.copyFile(src, dest[, mode])
src <string> | <Buffer> | <URL> 要复制的源文件地址
dest <string> | <Buffer> | <URL> 复制操作的目标文件地址
- 传递参数
要实现能通过输入源文件地址和目标地址去拷贝文件,就要能接收到node传递的参数,这里使用process.argv来获取启动node.js进程时传入的命令行参数。process.argv 属性返回数组,第一个元素将是 process.execPath,第二个元素将是正在执行的 JavaScript 文件的路径。,剩余元素是命令行传入的参数。 - 读取文件
实现对文件夹内容进行复制需要先读取到文件夹中的所有文件和文件类型,读取文件使用的api是
fs.readdir(path,withFileTypes)
path <string> | <Buffer> | <URL> 读取的文件夹地址
withFileTypes <boolean> 默认值: false
- 创建新文件夹
对文件夹进行操作时需要在目的地址处创建新的文件夹,使用的api是
fs.mkdir(path[, options], callback)
path <string> | <Buffer> | <URL> 创建文件夹的地址
- 路径拼接
对文件的各个操作都需要文件的地址,在创建新文件夹后也要获得新文件夹地址我采用的方法是路径拼接,将上级目录地址加上新文件名即为新文件夹的地址,路径拼接的api是
path.resolve() 方法将给定的路径序列从右到左处理,每个后续的 path 会被追加到前面,直到构建绝对路径
代码实现
const fs = require('fs')
const path = require('path')
//给node传递参数
//源文件夹地址
// ../2-fs/newFile/refile
const srcDir = process.argv[2]
//目标文件夹地址
//../2-fs/newFile/file
const destDir = process.argv[3]
copyFiles(srcDir,destDir)
//封装成函数,在文件中有多个文件夹时可以递归调用函数复制所有子目录下的文件
function copyFiles(src,dest){
//获取源文件地址中的所有文件和文件格式,
fs.readdir(src,{withFileTypes:true},(err,files) =>{
//files结果是一个对象
if (err){
console.log(err)
}
//遍历所有的所有的文件
files.forEach(function (srcFile) {
//判断是否为文件夹
if (srcFile.isDirectory()){
//源目标路径加上文件名即为新创建文件夹的路径
const destFile1 = path.resolve(dest,srcFile.name)
const srcFile1 = path.resolve(src,srcFile.name)
//同步创建文件夹
fs.mkdirSync(destFile1,err => {
console.log(err)
})
//如果是文件夹递归调用复制该文件夹中的文件
copyFiles(srcFile1,destFile1)
// console.log(srcFile1)
// console.log(destFile1)
}else {
// console.log(srcFile)
//拼接源文件的路径
const srcFileDir = path.resolve(src,srcFile.name)
//拼接复制目标文件路径
const destFile = path.resolve(dest,srcFile.name)
//如果该路径下不存在同名文件则复制该文件
if (!fs.existsSync(destFile.name)){
fs.promises.copyFile(srcFileDir,destFile)
}else {
console.log('文件名重复,复制失败')
}
}
})
})
}
console.log('复制中。。。。')
运行该js文件,然后在后面传入源地址和目标地址即可
node index.js 地址1 地址2
以上为脚本全部内容,仅为个人练习demo,有需要可以再进行二次封装,添加自己需要的功能