【问题标题】:lstatSync() Returning UndefinedlstatSync() 返回未定义
【发布时间】:2020-10-02 18:20:51
【问题描述】:

我绝对是 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 新手,所以这里的某些事情可能完全超出我的想象。

【问题讨论】:

    标签: javascript node.js fs


    【解决方案1】:

    问题是e.dataTransfer.files 在path 属性中返回一个包含完整文件名的file 对象数组,但fs.readdirSync 返回一个仅包含文件名的数组而没有它们的路径。

    所以第一次调用sendFiles(files) 函数时,files 中的每个file 都有一个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
        }
      }
    }
    

    【讨论】:

    • 当我将 lstatSync 切换为使用 file.name 而不是 file.path 时,它给了我一个 ENOENT 错误,因为原始文件名不足以作为目录路径。
    • 我的错误。我用正确的解决方案编辑了我的答案。
    • 这绝对让我更接近了。在实施您提供的非常有用的解决方案后,我现在正在重载调用堆栈,因为没有基本案例。我会继续努力的。
    • 您收到maximum call stack size exceeded 错误?
    • 太棒了,我实际上刚刚得到它。修复了另一个地方的错误,但非常感谢!
    猜你喜欢
    • 2019-11-17
    • 1970-01-01
    • 2016-11-18
    • 2018-03-14
    • 2019-12-24
    • 2016-05-15
    • 2017-03-11
    • 2019-07-09
    • 2020-05-22
    相关资源
    最近更新 更多