我用谷歌搜索
EPERM:不允许操作
我在npm和此错误的问题上遇到了很多麻烦。
这不是我的情况(不是重复的情况),因为我没有运行npm,而是运行自己的Node代码。
我收到此错误:
错误
{
Error: 'EPERM: operation not permitted',
errno: -1,
code: 'EPERM',
syscall: 'scandir',
path: '../../../Library/Application Support/CallHistoryDB/'
};
在我的主目录中运行以下代码时。
我同时使用了它
节点getInfo
和
sudo节点getInfo
但是我得到了同样的错误。
如果我在本地存储库上运行此代码,效果很好,但是当我尝试遍历整个主目录时,出现错误。
已执行的代码:
// Libraries
const fs = require('fs');
const h = require('./helper');
// Start recursing here
const start = '../../../';
// API
getThings(start).then(() => {
console.log(data);
}).catch(h.error)
// Accesses the file system and returns an array of files / folders
async function getThings (folder) {
const things = await fs.promises.readdir(folder);
for(let i = 0; i < things.length; i++) {
await getStats(things[i], folder);
}
}
// Gets statistics for each file/folder
async function getStats (thing, folder) {
const path = folder + thing;
const stats = await fs.promises.stat(path);
await checkForFolder(stats, thing, path);
}
// if the file/folder is a folder, recurse and do it again
async function checkForFolder(stats, thing, path){
// logThing(stats, thing, path);
if (stats.isDirectory() ) {
await getThings(path + '/');
}
}
研究
答案 0 :(得分:1)
'../../../Library/Application Support/CallHistoryDB/'
此路径受macOS安全设置保护,因为它可能包含敏感的电话历史记录数据。
如果您特别需要在Node应用程序中访问它,则需要在系统偏好设置中为正在运行该脚本的应用程序(例如Terminal.app,iTerm或IDE)启用完整磁盘访问。 , 如下所示。请注意,这将使您在终端中运行的所有应用程序可以访问您的敏感个人文件;小心地踩。
但是,如果您不需要专门访问此路径(并且您可能不需要),则更好的解决方案可能是在每次调用fs.promises.stat(path)
时分别捕获错误。最简单的方法是将对await fs.promises.stat(path)
的调用包装在try … catch
块中,然后打印或忽略错误。