编写节点js应用程序,我想等到创建文件。想知道是否有任何方法比我的方法更快,更准确,更好。
我的代码:
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);
}
})
我基本上想要实现的是,我想复制文件的内容并为每个用户创建另一个唯一的临时文件。我想等到创建文件,如果创建了文件,我只想执行一行代码然后删除文件。
谢谢。
答案 0 :(得分:1)
您应该将代码放在writeFile
回调中,如下所示:
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的异步性质确实不适合您,那么您也可以使用writeFileSync
。
答案 1 :(得分:0)
我建议将chokidar库https://github.com/paulmillr/chokidar用于文件系统事件。由于CPU使用率较高,建议不要使用轮询方法。 fs.watch有时不起作用(例如对于已安装的网络文件夹,它在不同的操作系统上的工作方式也略有不同)。
var watcher = chokidar.watch('your directory', {
persistent: true
});
watcher.on('add', path => { do what yo want with added files } );
答案 2 :(得分:0)
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);
}
我使用了上面的方法,该方法是有时间限制的,并使用'fs'库返回文件是否存在。它返回Promise<boolean>
答案 3 :(得分:0)
我有一个类似的用例。编写了一个骇人的解决方案(打字稿)
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 };