node.js服务器能否知道是否创建了服务器文件?

时间:2014-08-27 22:40:51

标签: node.js filesystems

这是让 node.js 服务器知道服务器上是否创建了文件的最优雅方式或技术?

这个想法是:创建了一个新图像(从网络摄像头开始) - >派遣一个活动!

更新:目录中新文件的名称未知 a priori ,文件由外部软件生成。

2 个答案:

答案 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()无论如何都有多个问题,我绝不会建议使用它...它确实可以检查文件是否已被删除...