2014-10-02 11 views
7

existiere ich Dateien automatisch bin zu erzeugen, und ich habe ein anderes Skript, das, wenn eine gegebene Datei wird bereits generiert, so wie könnte ich eine solche Funktion implementieren:NodeJS überprüfen Datei vorhanden ist, wenn nicht, warten, bis es

function checkExistsWithTimeout(path, timeout) 

welches überprüft, ob ein Pfad existiert, wenn nicht, warte darauf, util timeout.

+1

Auf welches Betriebssystem zielen Sie? Unter Linux/OSX können Sie Node.js ein Verzeichnis für Änderungen anzeigen lassen. – Brad

+0

Ich führe Code auf Linux – wong2

+2

das könnte nützlich sein; http://nodejs.org/docs/latest/api/fs.html#fs_fs_watchfile_filename_options_listener – renatoargh

Antwort

0

fs.watch() API ist, was Sie brauchen.

Lesen Sie alle dort genannten Vorbehalte, bevor Sie sie verwenden.

+1

Ich finde das nicht so nützlich wie fs.watch scheint die Datei zu benötigen, bevor sie angesehen werden kann ... –

0

Dies ist sehr viel ein Hack, aber funktioniert für schnelle Sachen. Hier

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

ist die Lösung:

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

Sie es wie folgt implementieren könnte, wenn Sie Knoten 6 oder höher haben.

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) 
    }) 
} 
0

Angenommen, Sie über die Verwendung Promises planen, da Sie nicht einen Rückruf in Ihrer Methode Unterschrift liefern haben, können Sie überprüfen, ob die Datei das Verzeichnis zur gleichen Zeit vorhanden ist und beobachtet, dann zu lösen, wenn die Datei vorhanden ist, oder die Datei wird erstellt, bevor die Zeitüberschreitung auftritt.

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(); 
      } 
     }); 
    }); 
} 
Verwandte Themen