2010-09-27 10 views
13

के माध्यम से node.js में फ़ाइल परिवर्तनों का पता लगाएं, यदि फ़ाइल बदलती है, तो मैं फ़ाइल के लिए परिवर्तनों का पता लगाना चाहता हूं, मैं सर्वर पर फ़ाइल की प्रतिलिपि बनाने के लिए एक scp कमांड निष्पादित करने के लिए child_process का उपयोग करूंगा। मैंने node.js दस्तावेज़ को देखा , fs.watchFile फ़ंक्शन ऐसा लगता है जो मैं करना चाहता हूं, लेकिन जब मैंने इसे आजमाया, तो किसी भी तरह से यह मेरी अपेक्षा के अनुसार काम नहीं करता है। निम्न कोड का इस्तेमाल किया गया:घड़ीफाइल

var fs = require('fs');                   

console.log("Watching .bash_profile"); 

fs.watchFile('/home/test/.bash_profile', function(curr,prev) { 
    console.log("current mtime: " +curr.mtime); 
    console.log("previous mtime: "+prev.mtime); 
    if (curr.mtime == prev.mtime) { 
     console.log("mtime equal"); 
    } else { 
     console.log("mtime not equal"); 
    } 
}); 
ऊपर कोड के साथ

, अगर मैं देख चुके फ़ाइल तक पहुँच, कॉलबैक फ़ंक्शन पर अमल करने के लिए, यह उत्पादन ही mtime जाएगा, और हमेशा उत्पादन "mtime नहीं बराबर" (मैं केवल पहुँचने के फ़ाइल)। आउटपुट:

Watching .bash_profile 
current mtime: Mon Sep 27 2010 18:41:27 GMT+0100 (BST) 
previous mtime: Mon Sep 27 2010 18:41:27 GMT+0100 (BST) 
mtime not equal 

किसी को पता है क्यों अगर बयान में विफल रहा है (यह भी का उपयोग कर === की पहचान की जांच करने की कोशिश की, लेकिन अभी भी एक ही आउटपुट प्राप्त) जब दो mtime ही कर रहे हैं?

उत्तर

17

mtime गुण Date वस्तुओं रहे हैं, तो इन कभी नहीं के बराबर हो सकता है। जावास्क्रिप्ट में दो अलग-अलग वस्तुओं केवल यदि वे वास्तव में एक ही वस्तु (चर एक ही स्मृति उदाहरण ओर इशारा करते हैं), तो इन दो दिनांक मानों एक ही हैं

obj1 = new Date(2010,09,27); 
obj2 = new Date(2010,09,27); 
obj3 = obj1; // Objects are passed BY REFERENCE! 

obj1 != obj2; // true, different object instances 
obj1 == obj3; // true, two variable pointers are set for the same object 
obj2 != obj3; // true, different object instances 

जांच करने के लिए कर रहे हैं बराबर हैं, का उपयोग

curr.mtime.getTime() == prev.mtime.getTime(); 

(मुझे वास्तव में यकीन नहीं है कि यह मामला है क्योंकि मैंने watchFile आउटपुट दिनांक ऑब्जेक्ट्स या तारों को आउटपुट नहीं किया है, लेकिन यह निश्चित रूप से आपके विवरण से इस तरह से लगता है)

+0

धन्यवाद, मुझे एहसास नहीं हुआ कि mtime संपत्ति एक वस्तु है (मैंने सोचा था कि वे स्ट्रिंग ऑब्जेक्ट हैं :(मैंने टाइपऑफ curr.mtime टाइप किया है, यह ऑब्जेक्ट लौटाता है, क्या जावास्क्रिप्ट में कोई तरीका है यह पता लगाने के लिए कि किस प्रकार की ऑब्जेक्ट उदाहरण के लिए, मैंने आपको obj1 == obj2 सोचा था, क्योंकि आप केवल समानता जांच को बदलते हैं, जब वे पहचान जांच करते हैं तो यह केवल झूठा है obj1 ==== obj2। –

+1

आप सेशन का उपयोग कर सकते हैं इरेटर 'exampleof' इस तरह: 'var d = नई तिथि(); यदि (डी उदाहरण दिनांक == सत्य) चेतावनी (1); या वैकल्पिक रूप से टेक्स्ट ऑब्जेक्ट प्रकार प्राप्त करने के लिए 'var d = new date(); Object.prototype.toString।फोन (घ); // "[ऑब्जेक्ट दिनांक]" ' – Andris

+0

एक बात जो मैंने नोटिस की है, अगर मैं ऐसा कुछ करता हूं: __var i = 10; अगर (मैं उदाहरण संख्या) चेतावनी (1); __ अगर कथन कभी सच नहीं है (टाइप करें i => "संख्या" और Object.prototype.toString.call (i) => "[ऑब्जेक्ट संख्या]", हालांकि अगर मैं घोषणा करता हूं के रूप में: var i = संख्या (10), यह काम करता है। किसी को इसके पीछे कारण पता है? –

0

त्वरित और गंदा समाधान। यदि आप पिछले या बाद के (< या>) के संदर्भ में दिनांक तुलना नहीं कर रहे हैं और आप बस डेटास्ट्रिंग की तुलना कर रहे हैं, तो बस प्रत्येक पर एक त्वरित toString() करें।

if (curr.mtime.toString() == prev.mtime.toString()) 
9

दुर्भाग्य से सही तरीका

if (+curr.mtime === +prev.mtime) {} 

+ बलों दिनांक वस्तु int करने के लिए जो unixtime है।

17

"चालाक" लोगों के लिए:

if (curr.mtime - prev.mtime) { 
    // file changed 
} 
+0

आप शायद छद्म लिख रहे हैं, लेकिन सिर्फ यह स्पष्ट करने के लिए कि ये दिनांक वस्तुएं हैं और पूर्णांक मान नहीं हैं: + curr.mtime - + prev.mtime –

+10

@DirkSmaverson घटाव दिनांक वस्तुओं को संख्याओं में जोड़ता है, जैसे यूनरी प्लस ऑपरेटर करता है, इसलिए यह बराबर है। – CEL

1

चीजें आप Watchr उपयोग कर सकते हैं उपयोगी घटनाओं प्राप्त करने के लिए (केवल change घटना आग अगर एक फ़ाइल वास्तव में बदल गया है जाएगा) आसान बनाने के लिए। यह भी पूरी निर्देशिका पेड़ :) देख समर्थन करता है

1

हम देख फ़ाइल है, जो भी एक centos एक विंडोज़ फाइल सिस्टम के साथ चल मशीन के संदिग्ध संदर्भ में काम करता है के लिए चौकीदार का उपयोग

(विंडोज़ मशीन पर चल आवारा virtualbox centos) https://github.com/paulmillr/chokidar

+0

यह मेरे लिए काम कर रहा है, जब मैक ओएसएक्स पर फ़ाइलों को अपडेट किया जाता है तो निगरानी। –

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^