Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/469.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript NodeJS等待文件创建_Javascript_Node.js - Fatal编程技术网

Javascript 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

编写一个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) }

    // 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 };