javascript - lstatSync() 返回未定义
问题描述
我绝对是 Node.js 的新手,我试图递归地删除文件夹中的所有文件,但是当使用 lstatSync(path) 时,它一直返回未定义。如果你好奇为什么这看起来很奇怪,而我正在使用 Materialize 和 JSX,那是因为这是 Electron 应用程序的一部分。
错误内容如下:
未捕获的 TypeError [ERR_INVALID_ARG_TYPE]:“路径”参数必须是字符串、缓冲区或 URL 类型之一。在 lstatSync 接收到未定义的类型
const sendFiles = (files) => {
for (let file of files) {
const stat = fs.lstatSync(file.path);
// if file is a folder, recursively check each file in the nested folders
if (stat.isDirectory()) {
// rename for clarity
let files = fs.readdirSync(file.path);
sendFiles(files);
} else {
// notify user about incompatible file types
if (
file.path.split(".").pop() !== "js" &&
file.path.split(".").pop() !== "css" &&
file.path.split(".").pop() !== "html" &&
file.path.split(".").pop() !== "svg"
) {
//materialize toast
M.toast({
html: `"${file.path
.split("/")
.pop()}" could not be minified due to incompatible file type.`,
});
} else {
//send to main process for minification
ipcRenderer.send("file:add", file.path);
setRedir(<Redirect to="/list" />);
}
}
}
};
这是调用函数的地方:
document.ondrop = (e) => {
sendFiles(e.dataTransfer.files);
e.preventDefault();
};
出现此问题是否有任何普遍的原因?正如我所说,我是 Node 新手,所以这里的某些事情可能完全超出了我的想象。
解决方案
问题是在属性中返回一个具有完整文件名e.dataTransfer.files
的对象数组,但返回一个只有文件名的数组而没有它们的路径。file
path
fs.readdirSync
因此,第一次调用该sendFiles(files)
函数时,每个函数file
都有files
一个path
属性。
但是一旦它碰到一个文件夹并尝试递归调用自己,它就会传递一个没有路径的文件名列表。由于它需要文件对象,而不是简单的名称,它抱怨说file.path
是undefined
.
这是一个修改后的函数,它递归地记录所有拖放文件的完整文件名,包括拖放文件夹中的所有文件:
function sendFiles(files) {
for (let file of files) {
file = file.path || file;
let folder;
if (fs.lstatSync(file).isDirectory()) {
let folder = file;
let files = fs.readdirSync(folder).map(fileName => {
return path.join(folder, fileName)
});
sendFiles(files);
} else {
console.log(file); // full filename with path
}
}
}
推荐阅读
- android - 如何将 Json 数组序列化为要在 Android Studio 中使用的数组
- javascript - 为什么警报在不工作时只工作一次?
- django - 生成数据表以在 Django 模板中进行迭代
- python - 尝试配置 gunicorn
- javascript - 不使用 split 方法查找字符串中最长的单词
- java - 如何在 JSON 中转换部分字符串?
- java - 如何在 Java 中创建高性能记录器
- python - 带有来自另一个模块的对象的 init 方法
- java - 将base64字符串转换为十进制时出错
- c++ - 用右值引用和可变参数模板替换 C++ std::bind 到 lambda