我在“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”循环中遇到文件读/写问题的主要内容,如果未能解决你的问题,请参考以下文章