Javascript NodeJS等待文件创建
编写一个NodeJS应用程序,我想在其中等待文件创建完成。我想知道是否有比我的方法更快、更准确、更好的方法 我的代码:Javascript NodeJS等待文件创建,javascript,node.js,Javascript,Node.js,编写一个NodeJS应用程序,我想在其中等待文件创建完成。我想知道是否有比我的方法更快、更准确、更好的方法 我的代码: const fs = require("fs"); try { // Create files directory if not exists if (!fs.existsSync('./files')) fs.mkdirSync("./files") } catch (e) { logger.error("error:" + e
const fs = require("fs");
try { // Create files directory if not exists
if (!fs.existsSync('./files'))
fs.mkdirSync("./files")
} catch (e) { logger.error("error:" + e) }
// Create unique temporary files for each user
fs.readFile("./file.js", 'utf8', (err, data) => {
if (err)
logger.error("error" + err)
fs.writeFile(`./files/file.js`, data, (err) => {
if (err)
logger.error("error" + err)
logger.warn('successfully created')
});
while (!fs.existsSync(`./files/file.js`))
setTimeout(() => { }, 5000)
if (fs.existsSync(`./files/file.js`)) {
setTimeout(async () => {
// My code that should be executed only once when the file is created..then delete the file
}, 1000);
}
})
我基本上想要实现的是,我想要复制一个文件的内容,并为每个用户创建另一个唯一的临时文件。我想等到文件被创建,如果文件被创建,我想只执行一次代码行,然后删除文件
谢谢。您应该将代码放在回调中,如下所示:
const fs = require("fs");
try { // Create files directory if not exists
if (!fs.existsSync('./files'))
fs.mkdirSync("./files")
} catch (e) {
logger.error("error:" + e)
}
// Create unique temporary files for each user
fs.readFile("./file.js", 'utf8', (err, data) => {
if (err)
logger.error("error" + err)
fs.writeFile(`./files/file.js`, data, (err) => {
if (err)
logger.error("error" + err)
logger.warn('successfully created')
// Your code that should be executed only once when the file is created..then delete the file
});
})
如果Javascript的异步特性确实不适合您,那么您也可以使用。我建议对文件系统事件使用chokidar库。由于CPU使用率较高,因此不建议使用轮询方法。fs.watch有时不起作用(例如,对于挂载的网络文件夹,它在不同的操作系统上的工作原理也略有不同)
我使用了上面的方法,该方法是有时间限制的,如果文件存在或未使用“fs”库,则返回该方法。它返回
Promise
我有一个类似的用例。写了一个黑客解决方案(打字脚本)
似乎您想使用
fs.watch
:除非您真的在做模板字符串,否则不要使用反勾号,只使用普通的单引号(或双引号,但一致性!)为什么不使用writeFile
的回调?如果您对promisesCan不感兴趣,也可以使用writeFileSync
。如果您没有将代码放入fs.writeFile
的回调中,我建议对文件系统事件使用chokidar。由于CPU使用率很高,所以不建议使用轮询方法。哈哈,在阅读了你的答案后,我意识到我的编码有多么愚蠢,我本可以选择直截了当的方式,而不是所有这些超时之类的
var watcher = chokidar.watch('your directory', {
persistent: true
});
watcher.on('add', path => { do what yo want with added files } );
async function waitForFileExists(filePath, currentTime = 0, timeout = 5000) {
if (fs.existsSync(filePath)) return true;
if (currentTime === timeout) return false;
// wait for 1 second
await (new Promise(resolve, reject) => setTimeout(() => resolve(true), 1000));
// waited for 1 second
return checkIfFileExists(filePath, currentTime + 1000, timeout);
}
import fs from 'fs';
/**
* @param filePath : string
* @description Waits for 15 seconds for a file to exist.
*/
const watchFile = (filePath: string): boolean => {
const watchStartTime = Date.now();
while (!fs.existsSync(filePath)) {
if (Date.now() - watchStartTime > 15) {
return false;
}
}
return true;
};
export { watchFile };