我在“for”循环中遇到文件读/写问题

Posted

技术标签:

【中文标题】我在“for”循环中遇到文件读/写问题【英文标题】:I have a problem with file reading/writing inside of a "for" loop 【发布时间】:2021-09-26 20:58:10 【问题描述】:

每当执行脚本时,我都会尝试设置一个包含不同文件的文件夹。 如果文件夹已存在,则无法执行脚本。

当我执行脚本时,会调用一个异步函数,并且该函数的一部分会导致问题...

这是我的代码:

      // I want to setup a sub folder with 6 json files     

      for(i = 1; i < 7; i++)   // I repeat the operation 6 times

        await fs.mkdir(`./data/$member.id/team/$i.json`, (err) => console.log(err)); // I create the file
        let teamMember = new jsoning(`./data/$member.id/team/$i.json`); // I initiate the file with jsoning

        // and then I write things inside
        teamMember.set(`pokemon`, "");
        teamMember.set(`nickname`, "");
        teamMember.set(`shiny`, "");
        teamMember.set(`hasMultipleForms`, "");
        teamMember.set(`formList`, "");
        teamMember.set(`form`, "");
        teamMember.set(`ability`, "");
        teamMember.set(`baseStats`, "");
        teamMember.set(`currentStats`, "");
        teamMember.set(`evs`, "");
        teamMember.set(`ivs`, "");
        teamMember.set(`moves`, "");
        teamMember.set(`movesPP`, "");
        teamMember.set(`heldItem`, "");
        teamMember.set(`currentHps`, "");
        teamMember.set(`statusEffect`, "");

      

但它返回一个错误:

(节点:16144)UnhandledPromiseRejectionWarning:错误:ENOENT:没有这样的文件或目录, 打开 'C:\Users\Vincent\Documents\PokéBot\data\533791662628143106\team\1.json' 在 Object.openSync (fs.js:498:3) 在 Object.writeFileSync (fs.js:1524:35) 错误号:-4058, 代码:'ENOENT', 系统调用:'mkdir', 路径:'C:\Users\Vincent\Documents\PokéBot\data\533791662628143106\team\1.json'

我尝试在mkdir 之前删除await,但没有成功。我还尝试将整个 jsoning 部分放在 mkdir 回调中,首先作为普通函数,然后使用异步。

当我尝试在mkdir 之后添加.then 时,我得到:无法读取未定义的“then”,加上错误:ENOENT...

PS : jsoning 是一个编辑 json 文件的库,这里是他们的网站和文档:https://jsoning.js.org/

teamMember.set 部分之前使用 await 效果更好,但我尝试过,它并没有改变错误消息。

请帮帮我,这个错误是从哪里来的?

编辑:我想用 mkdir 生成 json 文件,但这不是要做的事情。这是工作代码:

      const  mkdir  = require("fs/promises");
      await mkdir(`./data/$member.id/team`, (err)=> console.log(err));

      // User team
      for(let i = 1; i < 7; i++) 
          let teamMember = new jsoning(`./data/$member.id/team/$i.json`);
          await teamMember.set(`pokemon`, "");
          await teamMember.set(`nickname`, "");
          await teamMember.set(`shiny`, "");
          await teamMember.set(`hasMultipleForms`, "");
          await teamMember.set(`formList`, "");
          await teamMember.set(`form`, "");
          await teamMember.set(`ability`, "");
          await teamMember.set(`baseStats`, "");
          await teamMember.set(`currentStats`, "");
          await teamMember.set(`evs`, "");
          await teamMember.set(`ivs`, "");
          await teamMember.set(`moves`, "");
          await teamMember.set(`movesPP`, "");
          await teamMember.set(`heldItem`, "");
          await teamMember.set(`currentHps`, "");
          await teamMember.set(`statusEffect`, "");
      

【问题讨论】:

我想澄清一下,路径为PokéBot\data\533791662628143106的文件夹是在这部分脚本执行之前创建的并且确实存在,代码应该是创建team/文件夹和json文件里面。 @Andreas 我希望我的代码创建这个文件 【参考方案1】:

听起来您正在使用原始回调 fs 模块(“不能在 undefined 上调用 then 使这一点相当清楚)。因此您的代码正在继续并尝试使用目录 before mkdir 已创建它,因为您没有使用 mkdir 回调。

如果你想使用 Promise,请使用 fsPromises 模块 as described here:

ESM:

import * as fs from "fs/promises";

CJS:

const fs = require("fs/promises");

然后await 将暂停循环,直到工作完成。

如果你使用的是mkdir,你也可以直接导入:

ESM:

import  mkdir  from "fs/promises";

CJS:

const  mkdir  = require("fs/promises");

然后使用mkdir 而不是fs.mkdir


旁注:我在任何地方都没有看到i 的声明。如果没有,请务必申报。

【讨论】:

谢谢!我发现我实际上并不知道 mkdir 在做什么,因为我试图用它生成 json 文件......你的回答很有帮助,因为它帮助我修改了我的代码:我使用 promise mkdir 来制作 @在这段代码之前的 987654338@ 文件夹,然后我用异步 jsoning 代码运行 for 循环,它工作了。

以上是关于我在“for”循环中遇到文件读/写问题的主要内容,如果未能解决你的问题,请参考以下文章

C语言for循环嵌套延时问题

文件操作

文件处理

批处理:如何在 FOR 循环中附加字符串

Python - 写入 CSV 文件和 for 循环

Python-复习-文件操作-21