Node.js 复制文件 EPERM:不允许操作

sal*_*san 19 windows filesystems copy node.js

nodejs v14.17.0我尝试使用to复制字体%localappdata%\Microsoft\Windows\Fonts,当尝试提示时没有问题

copy /B "Haloha Free Trial.ttf" /V %localappdata%\Microsoft\Windows\Fonts\
    1 file(s) copied.
Run Code Online (Sandbox Code Playgroud)

但是当尝试使用nodejs时,我遇到了这个问题

[Error: EPERM: operation not permitted, copyfile 'D:\dev\test\javascript\font\Haloha Free Trial.ttf' -> 'C:\Users\omen\AppData\Local\Microsoft\Windows\Fonts'] {
  errno: -4048,
  code: 'EPERM',
  syscall: 'copyfile',
  path: 'D:\\dev\\test\\javascript\\font\\Haloha Free Trial.ttf',
  dest: 'C:\\Users\\omen\\AppData\\Local\\Microsoft\\Windows\\Fonts'
}
Run Code Online (Sandbox Code Playgroud)

这是我的代码

let options = process.argv.slice(2);
console.log(options[0]);

console.log(process.env.LOCALAPPDATA);
const locallAppdata = process.env.LOCALAPPDATA;

const fs = require('fs');

fs.copyFile( options[0], locallAppdata+'\\Microsoft\\Windows\\Fonts\\', (err) =>{
    if(err) throw err;
    console.log( argv[0] + " was copied ");
});

Run Code Online (Sandbox Code Playgroud)

怎么解决呢?

sal*_*san 11

根据官方文档fs.copyFile

  • src <字符串> | <缓冲区> | <URL>要复制的源文件名
  • dest <字符串> | <缓冲区> | <URL>复制操作的目标文件名

dest中,需要目标文件名,而不仅仅是目标目录。

fs.copyFile(src, dest[, mode], callback)
Run Code Online (Sandbox Code Playgroud)

在本例中,dest = 'locallAppdata+'\\Microsoft\\Windows\\Fonts\\' + options[0]

let dest = locallAppdata+'\\Microsoft\\Windows\\Fonts\\' + options[0];
let src =  options[0];
    
 fs.copyFile( src, dest, (err) =>{
     if(err) throw err;
             console.log( options[0] + " was copied ");
 });
Run Code Online (Sandbox Code Playgroud)