2017-07-06 66 views
0

我试图监视任何新添加的文件到ftp服务器,该服务器将目录映射到正在运行节点应用程序的服务器上的驱动器。问题是它不会为通过ftp添加的文件注册任何事件;当通过节点应用程序修改或创建文件时,它们可以很好地拾取。使用nodejs监视目录 - 未注册ftp上传的文件

我目前使用chokidar看目录和日志下面的简单代码的任何事件

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`)); 

我已经添加了awaitWriteFinish选项来尝试看看它是否将注册文件的时候从ftp传输完成,但没有喜悦。

有什么建议吗?

+0

您是否尝试过使用本地API来做到这一点? https://nodejs.org/dist/latest-v6.x/docs/api/fs.html#fs_fs_watch_filename_options_listener –

+0

是的,结果相同。我已经读过,chokadir在注册fs.watch错过的活动时更加可靠。 – user1565766

回答

0

您可以使用本机模块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); 

但在子文件夹上面的例子也不会看的文件。另一种观察所有子文件夹的方法是使用unix find通过节点child_process.exec的功能。

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

如果文件直接位于/ test目录中,这是一个很好的解决方案。但是,我需要检查/ test/xx/xx中的文件。 – user1565766

+0

增加了一个使用unix'fiind'来观察所有子文件夹的例子 – gnuns