2017-07-06 1 views
0

Ich versuche nach neu hinzugefügten Dateien auf einem FTP-Server zu suchen, der das Verzeichnis einem Laufwerk auf dem Server zugeordnet hat, auf dem die Knotenanwendung ausgeführt wird. Das Problem ist, dass es keine Ereignisse für Dateien registriert, die über ftp hinzugefügt wurden; Wenn Dateien durch die Knotenanwendung geändert oder erstellt werden, werden sie gut aufgenommen.Ein Verzeichnis mit Nodejs ansehen - Keine von ftp hochgeladenen Dateien registrieren

ich derzeit chokidar bin mit dem Verzeichnis zu beobachten und mit dem einfachen Code unten alle Ereignisse protokollieren:

const watcher = chokidar.watch('./myDir', { 
persistent: true, 
awaitWriteFinish: { 
    stabilityThreshold: 2000, 
    pollInterval: 100 
} 
}); 

watcher 
.on('add', path => console.log(`File ${path} has been added`)) 
.on('change', path => console.log(`File ${path} has been changed`)); 

ich die awaitWriteFinish Option hinzugefügt habe, um zu versuchen, um zu sehen, ob es registrieren, wenn die Datei abgeschlossen von der FTP-Übertragung, aber ohne Freude.

Irgendwelche Vorschläge?

+0

Haben Sie versucht, das mit der nativen API zu tun? https://nodejs.org/dist/latest-v6.x/docs/api/fs.html#fs_fs_watch_filename_options_listener –

+0

Ja, mit dem gleichen Ergebnis. Ich hatte gelesen, dass Chokadir zuverlässiger Ereignisse registrierte, die fs.watch verpasste. – user1565766

Antwort

0

Sie können ein Verzeichnis mit dem nativen Modul sehen fs:

const fs = require('fs'); 
const folderPath = './test'; 
const pollInterval = 300; 

let folderItems = {}; 
setInterval(() => { 
    fs.readdirSync(folderPath) 
    .forEach((file) => { 
    let path = `${folderPath}/${file}`; 
    let lastModification = fs.statSync(path).mtimeMs; 
    if (!folderItems[file]) { 
     folderItems[file] = lastModification; 
     console.log(`File ${path} has been added`); 
    } else if (folderItems[file] !== lastModification) { 
     folderItems[file] = lastModification; 
     console.log(`File ${path} has been changed`); 
    } 
    }); 
}, pollInterval); 

Aber das obige Beispiel werden die Dateien in Unterordner nicht sehen. Ein anderer Ansatz, um alle Unterordner zu beobachten, ist die Verwendung von Unix find über den Knoten child_process.exec Funktion.

const fs = require('fs'); 
const {execSync} = require('child_process'); 
const folderPath = './test'; 
const pollInterval = 500; 

let folderItems = {}; 
setInterval(() => { 
    let fileList = execSync(`find ${folderPath}`).toString().split('\n'); 
    for (let file of fileList) { 
    if (file.length < 1) continue; 
    let lastModification = fs.statSync(file).mtimeMs; 
    if (!folderItems[file]) { 
     folderItems[file] = lastModification; 
     console.log(`File ${file} has been added`); 
    } else if (folderItems[file] !== lastModification) { 
     folderItems[file] = lastModification; 
     console.log(`File ${file} has been changed`); 
    } 
    } 
}, pollInterval); 
+0

Dies ist eine gute Lösung, wenn sich die Dateien direkt im Verzeichnis/test befinden. Ich muss jedoch nach Dateien in/test/xx/xx suchen. – user1565766

+0

Ein Beispiel wurde hinzugefügt, in dem unix 'fiind' verwendet wird, um alle Unterordner anzuzeigen – gnuns

Verwandte Themen