这是让 node.js 服务器知道服务器上是否创建了文件的最优雅方式或技术?
这个想法是:创建了一个新图像(从网络摄像头开始) - >派遣一个活动!
更新:目录中新文件的名称未知 a priori ,文件由外部软件生成。
答案 0 :(得分:2)
你应该看看fs.watch()
。它允许您“观察”文件或目录,并在事情发生变化时接收事件。
注意:该文档指出fs.watch
在各个平台上不一致,因此您应该在使用之前将其考虑在内。
fs.watch(fileOrDirectoryPath, function(event, filename) {
// Something changed with filename, trigger event appropriately
});
从文档中还要注意一些事项:
每个都不支持在回调中提供filename参数 平台(目前仅支持Linux和Windows)。即使在 支持的平台文件名并不总是保证提供。 因此,不要假设始终提供filename参数 回调,如果它为null,则有一些回退逻辑。
如果您的平台上没有filename
并且您正在观看某个目录,则可能需要执行一些操作,您最初会读取该目录并缓存其中的文件列表。然后,当您从fs.watch
获取事件时,再次读取该目录并将其与缓存的文件列表进行比较,以查看添加的内容(如果有的话)。
更新1:有一个名为watch, on github的好模块,可以轻松查看新文件的目录。
更新2:我汇总了一个示例,说明如何在将新文件添加到目录时使用fs.watch
获得通知。我认为上面链接的模块可能是更好的方法,但我认为如果你自己做的话,有一个基本的例子说明如何工作会很好。
注意:这是一个相当简单的示例,只是为了说明它如何在一般情况下发挥作用。它几乎肯定可以更有效地完成,而且远未经过彻底的测试。
function watchForNewFiles(directory, callback) {
// Get a list of all the files in the directory
fs.readdir(directory, function(err, files) {
if (err) {
callback(err);
} else {
var originalFiles = files;
// Start watching the directory for new events
var watcher = fs.watch(directory, function(event, filename) {
// Get the updated list of all the files in the directory
fs.readdir(directory, function(err, files) {
if (err) {
callback(err);
} else {
// Filter out any files we already knew about
var newFiles = files.filter(function(f) {
return (originalFiles.indexOf(f) < 0);
});
// Reset our list of "original" files
originalFiles = files;
// If there are new files detected, call the callback
if (newFiles.length) {
callback(null, newFiles);
}
}
})
});
}
});
}
然后,要观看您称之为的目录:
watchForNewFiles(someDirectoryPath, function(err, files) {
if (err) {
// handle error
} else {
// handle any newly added files
// "files" is an array of filenames that have been added to the directory
}
});
答案 1 :(得分:1)
我在这里使用此代码提出了我自己的解决方案:
var fs = require('fs');
var intID = setInterval(check,1000);
function check() {
fs.exists('file.txt', function check(exists) {
if (exists) {
console.log("Created!");
clearInterval(intID);
}
});
}
您可以使用文件名在check函数中添加一个参数,并在路径中调用它。
我在fs.watch()
上做了一些测试,如果没有创建文件,它就不起作用。 fs.watch()
无论如何都有多个问题,我绝不会建议使用它...它确实可以检查文件是否已被删除...