2012-05-26 21 views
6

जब कोड के नीचे भाग गया है, घड़ी केवल अगर मैं संपादित करें और मैन्युअल रूप से tmp.txt बचाने के लिए, या तो मेरी आईडीई, TextEditor का उपयोग कर शुरू हो रहा है .app, या vim।NodeJS निर्देशिका केवल आग पर fs.watch जब संपादक द्वारा बदल गया है, लेकिन खोल नहीं या FS मॉड्यूल

यह न लिखने धारा या मैनुअल खोल उत्पादन पुनर्निर्देशन की विधि द्वारा।

हालांकि अगर मैं फ़ाइल स्वयं देख सकते हैं, ("परीक्षण"> /path/to/tmp.txt "गूंज टाइपिंग) करता है और । नहीं अपने dirname, तो यह काम करता है

var fs, Path, file, watchPath, w; 

fs = require('fs'); 
Path = require('path'); 
file = __dirname + '/tmp.txt'; 
watchPath = Path.dirname(file); // changing this to just file makes it trigger 

w = fs.watch (watchPath, function (e,f) { 
    console.log("will not get here by itself"); 
    w.close(); 
}); 
fs.writeFileSync(file,"test","utf-8"); 

fs.createWriteStream(file, { 
    flags:'w', 
    mode: 0777 
}) 
.end('the_date="'+new Date+'";'); // another method fails as well 

setTimeout (function() { 
    fs.writeFileSync(file,"test","utf-8"); 
},500); // as does this one 
// child_process exec and spawn fail the same way with or without timeout 

तो प्रश्न हैं: क्यों और कैसे एक नोड स्क्रिप्ट से प्रोग्राम के रूप में इस घटना को गति प्रदान करने

धन्यवाद

+0

सिर्फ fs.watch बदल -> fs.watchFile और इसके पूर्ण हो जाने। रेफरी: [गिट-लिंक] (https://github.com/joyent/node/issues/3640) – mayankcpdixit

उत्तर

9

यह ट्रिगर नहीं करता है क्योंकि एक फ़ाइल की सामग्री में कोई परिवर्तन निर्देशिका में कोई परिवर्तन नहीं है।

कवर के तहत, कम से कम 0.6 के रूप में, मैक पर fs.watch kqueue का उपयोग करता है, और यह kqueue फाइल सिस्टम सूचनाओं के चारों ओर एक सुंदर पतली आवरण है। इसलिए, यदि आप वास्तव में विवरणों को समझना चाहते हैं, तो आपको क्यूकू, और इनोड और उस तरह की चीजों को समझना होगा।

लेकिन यदि आप एक छोटे से "झूठ बोलने वाले बच्चों" स्पष्टीकरण चाहते हैं: एक उपयोगकर्ता "फ़ाइल" के रूप में क्या सोचता है वास्तव में दो अलग-अलग चीजें हैं- वास्तविक फ़ाइल, और निर्देशिका प्रविष्टि जो वास्तविक फ़ाइल को इंगित करती है। यही वह चीज है जो आपको हार्ड लिंक जैसी चीजें रखने की अनुमति देता है, और ऐसी फाइलें जिन्हें अभी भी पढ़ा जा सकता है और उन्हें हटाए जाने के बाद भी लिखा जा सकता है, और इसी तरह।

सामान्य रूप से, जब आप किसी मौजूदा फ़ाइल को लिखते हैं, तो यह निर्देशिका प्रविष्टि में कोई परिवर्तन नहीं करता है, इसलिए निर्देशिका देखने वाले किसी भी व्यक्ति को कोई परिवर्तन नहीं दिखाई देगा। यही कारण है कि echo> tmp.txt आपको ट्रिगर नहीं करता है।

हालांकि, यदि आप, उदाहरण के लिए, एक नई अस्थायी फ़ाइल लिखें और फिर इसे पुरानी फ़ाइल पर ले जाएं, जो निर्देशिका प्रविष्टि को बदलता है (इसे पुराने फ़ाइल की बजाय नई फ़ाइल में पॉइंटर बना देता है), तो आप सूचित किया जाना। यही कारण है कि TextEditor.app आपको ट्रिगर करता है।

9

पतली?! जी आप निर्देशिका को देखने के लिए कहा है और न फ़ाइल, है।

निर्देशिका अद्यतन नहीं होती है जब फ़ाइल संशोधित, जैसे खोल पुनर्निर्देशन के माध्यम से; इस मामले में, फ़ाइल खोला, संशोधित, और बंद है। निर्देशिका नहीं बदली गई है - केवल फाइल है।

आप किसी फ़ाइल को संशोधित करने के लिए एक पाठ संपादक का उपयोग करता है, सिस्टम के सामान्य सेट पर्दे के पीछे कॉल इस तरह दिखता है:

fd = open("foo.new") 
write(fd, new foo contents) 
unlink("foo") 
rename("foo.new", "foo") 

इस तरह, foo फ़ाइल या तो पूरी तरह से पुरानी फाइल या पूरी तरह से है नई फाइल, और नई सामग्री के साथ "आंशिक फ़ाइल" होने का कोई तरीका नहीं है। नामकरण परिचालन निर्देशिका को संशोधित करें, इस प्रकार निर्देशिका घड़ी को ट्रिगर करें।

+0

मूल रूप से वही जानकारी मेरे एक साथ उत्तर में है, लेकिन मुझे लगता है कि यह मेरे से अधिक पठनीय है, इसलिए मैं ऊपर उठ रहा हूं यह। – abarnert

+0

@ बार्नर्ट: लेकिन पिंग एक अच्छा विचार था, आपका जवाब निश्चित रूप से +1 के लायक भी है। :) – sarnold

4

हालांकि उपरोक्त जवाब उचित लगता है, वे पूरी तरह से सही नहीं हैं। यह वास्तव में फ़ाइल नामों के लिए निर्देशिका सुनने में सक्षम होने के लिए एक बहुत ही उपयोगी विशेषता है, न केवल "नाम"। मुझे लगता है कि यह सुविधा कम से कम विंडोज़ में और नोड 0.9 में अपेक्षित काम करती है।2 भी मैक के लिए काम कर रहा है, क्योंकि वे FSEvents एपीआई कि सुविधा का समर्थन करने के लिए बदल:

Version 0.9.2 (Unstable)