NodeJS等待文件创建

时间:2018-01-30 15:08:35

标签: javascript node.js

编写节点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);
        }
    })

我基本上想要实现的是,我想复制文件的内容并为每个用户创建另一个唯一的临时文件。我想等到创建文件,如果创建了文件,我只想执行一行代码然后删除文件。

谢谢。

4 个答案:

答案 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 };