2012-02-20 60 views
4

我想監視的文件是(軟)與node.js的watchFile(symlink'ed)用下面的代碼:如何觀看使用watchFile()在node.js中symlink'ed文件

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/actual/file。 當對/ path/to/the/actual/file進行更改時,不會觸發任何事件。我必須用/ path/to/the/actual/file替換符號鏈接,以使其工作。在我看來,watchFile無法觀看符號鏈接的文件。當然,我可以通過使用spawn + tail方法來完成這項工作,但我不希望使用該路徑,因爲它會引入更多開銷。

所以我的問題是我怎樣才能使用watchFile()在node.js中觀看符號鏈接的文件。預先感謝鄉親們。

回答

23

你可以使用fs.readlink

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

當然,你可以讓愛好者和寫一個小包裝,可以觀看任何文件或它的鏈接,所以你不必去想它。

UPDATE:這裏有這樣的包裝,爲未來:

/** 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); 
     } 
    }); 
} 
+1

正是我一直在尋找,多謝。我希望我可以對你的答案進行投票,但爲了做到這一點,我必須至少有15個聲望。將您的答案標記爲已接受。 – ricochen 2012-02-20 17:34:41

+0

這很酷,讓我們希望別人喜歡它。 ;) – 2012-02-20 17:43:25