Как посмотреть файлы с символьными ссылками в node.js, используя watchFile () - PullRequest
4 голосов
/ 20 февраля 2012

Я пытаюсь отследить файл, который (soft) symlink'ed с помощью watchFile () с node.js со следующим кодом:

var fs=require('fs')
    , file= './somesymlink'
    , config= {persist:true, interval:1}; 

fs.watchFile(file, config, function(curr, prev) { 
    if((curr.mtime+'')!=(prev.mtime+'')) { 
        console.log( file+' changed'); 
    } 
});

В приведенном выше коде . /somesymlink - это (мягкая) символическая ссылка на / path / to / the current / file .Когда в файл / path / to / the / current / вносятся изменения, событие не запускается.Я должен заменить символическую ссылку на / path / to / the actual / file, чтобы она заработала.Мне кажется, что watchFile не может смотреть файлы с символическими ссылками.Конечно, я мог бы сделать эту работу, используя метод spawn + tail, но я предпочитаю не использовать этот путь, так как он привел бы к дополнительным накладным расходам.

Поэтому мой вопрос заключается в том, как я могу посмотреть файлы с символическими ссылками в node.jsиспользуя watchFile ().Заранее спасибо.

1 Ответ

24 голосов
/ 20 февраля 2012

Вы можете использовать fs.readlink :

fs.readlink(file, function(err, realFile) {
    if(!err) {
        fs.watch(realFile, ... );
    }
});

Конечно, вы можете стать хитрее и написать небольшую оболочку, которая может смотреть либо файл, либо его ссылку, так что вы не можетене надо об этом думать.

ОБНОВЛЕНИЕ: Вот такая оболочка, на будущее:

/** Helper for watchFile, also handling symlinks */
function watchFile(path, callback) {
    // Check if it's a link
    fs.lstat(path, function(err, stats) {
        if(err) {
            // Handle errors
            return callback(err);
        } else if(stats.isSymbolicLink()) {
            // Read symlink
            fs.readlink(path, function(err, realPath) {
                // Handle errors
                if(err) return callback(err);
                // Watch the real file
                fs.watch(realPath, callback);
            });
        } else {
            // It's not a symlink, just watch it
            fs.watch(path, callback);
        }
    });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...