Nodejs检查文件是否存在,如果不存在,则等待它存在

时间:2014-10-02 16:57:01

标签: node.js

我自动生成文件,并且我有另一个脚本来检查是否已经生成了给定文件,所以我该如何实现这样的功能:

function checkExistsWithTimeout(path, timeout)

将检查路径是否存在,如果不存在,则等待它,util timeout。

7 个答案:

答案 0 :(得分:7)

假设您计划使用Promises,因为您没有在方法签名中提供回调,您可以检查该文件是否存在并同时查看该目录,然后解析该文件是否存在,或者在超时发生之前创建文件。

function checkExistsWithTimeout(filePath, timeout) {
    return new Promise(function (resolve, reject) {

        var timer = setTimeout(function () {
            watcher.close();
            reject(new Error('File did not exists and was not created during the timeout.'));
        }, timeout);

        fs.access(filePath, fs.constants.R_OK, function (err) {
            if (!err) {
                clearTimeout(timer);
                watcher.close();
                resolve();
            }
        });

        var dir = path.dirname(filePath);
        var basename = path.basename(filePath);
        var watcher = fs.watch(dir, function (eventType, filename) {
            if (eventType === 'rename' && filename === basename) {
                clearTimeout(timer);
                watcher.close();
                resolve();
            }
        });
    });
}

答案 1 :(得分:2)

fs.watch() API就是您所需要的。

在使用之前,请务必阅读其中提到的所有注意事项。

答案 2 :(得分:1)

canActivate(
    next: ActivatedRouteSnapshot,
    state: RouterStateSnapshot): Observable<boolean | UrlTree> | Promise<boolean | UrlTree> | boolean | UrlTree {
    return this.service.checkSesh();
}

答案 3 :(得分:0)

以下是解决方案:

// Wait for file to exist, checks every 2 seconds
function getFile(path, timeout) {
    const timeout = setInterval(function() {

        const file = path;
        const fileExists = fs.existsSync(file);

        console.log('Checking for: ', file);
        console.log('Exists: ', fileExists);

        if (fileExists) {
            clearInterval(timeout);
        }
    }, timeout);
};

答案 4 :(得分:0)

如果您有节点6或更高版本,则可以像这样实现它。

const fs = require('fs')

function checkExistsWithTimeout(path, timeout) {
  return new Promise((resolve, reject) => {
    const timeoutTimerId = setTimeout(handleTimeout, timeout)
    const interval = timeout / 6
    let intervalTimerId

    function handleTimeout() {
      clearTimeout(timerId)

      const error = new Error('path check timed out')
      error.name = 'PATH_CHECK_TIMED_OUT'
      reject(error)
    }

    function handleInterval() {
      fs.access(path, (err) => {
        if(err) {
          intervalTimerId = setTimeout(handleInterval, interval)
        } else {
          clearTimeout(timeoutTimerId)
          resolve(path)
        }
      })
    }

    intervalTimerId = setTimeout(handleInterval, interval)
  })
}

答案 5 :(得分:-1)

result

答案 6 :(得分:-2)

这非常黑客,但适用于快速的东西。

function wait (ms) {
    var now = Date.now();
    var later = now + ms;
    while (Date.now() < later) {
        // wait
    }
}