जब वे बदले जाते हैं, तो नोड.जेएस और प्रिंट फ़ाइल पथ का उपयोग करने के लिए एक फ़ोल्डर देखें


87

मैं एक नोड.जेएस स्क्रिप्ट लिखने की कोशिश कर रहा हूं जो फाइलों की निर्देशिका में बदलाव के लिए देखता है, और फिर उन फाइलों को प्रिंट करता है जो बदल जाती हैं। मैं इस स्क्रिप्ट को कैसे संशोधित कर सकता हूं ताकि यह एक निर्देशिका (एक व्यक्तिगत फ़ाइल के बजाय) को देखता है, और निर्देशिका के फ़ाइलों के नामों को प्रिंट करता है जैसे कि वे बदले जाते हैं?

var fs = require('fs'),
    sys = require('sys');
var file = '/home/anderson/Desktop/fractal.png'; //this watches a file, but I want to watch a directory instead
fs.watchFile(file, function(curr, prev) {
    alert("File was modified."); //is there some way to print the names of the files in the directory as they are modified?
});

मुझे आश्चर्य है कि अगर यह प्रासंगिक है: stackoverflow.com/questions/12063266/… (मैं gruntjs से परिचित नहीं हूं, हालांकि - मुझे उम्मीद है कि अन्य समाधान हैं।)
एंडरसन ग्रीन

शायद नोड-इनोटिफ़-प्लसप्लस जैसा कुछ उपयोगी होगा: stackoverflow.com/questions/5877263/…
एंडरसन ग्रीन

आप कौन सा ओएस चला रहे हैं? यह एक फ़ाइल को देखने के लिए निम्न स्तर के तंत्र के रूप में बहुत मायने रखता है क्योंकि यूनिक्स / लिनक्स का उपयोग करता है inotify, OSX का उपयोग करता है FSWatchऔर मुझे Windoze के बारे में कोई पता नहीं है लेकिन मुझे यकीन है कि Google आपको बता सकता है।
सिक्रिन डे

1
हालांकि मैंने मूल रूप से node-inotifyअपनी परियोजना में मैदान का उपयोग किया था , मैंने अंततः स्विच किया node-inotify-plusplusक्योंकि जो अमूर्त पसंद नहीं करता है? =)
srquinn

जवाबों:


145

चोकीदार की कोशिश करें :

var chokidar = require('chokidar');

var watcher = chokidar.watch('file or dir', {ignored: /^\./, persistent: true});

watcher
  .on('add', function(path) {console.log('File', path, 'has been added');})
  .on('change', function(path) {console.log('File', path, 'has been changed');})
  .on('unlink', function(path) {console.log('File', path, 'has been removed');})
  .on('error', function(error) {console.error('Error happened', error);})

चोकीदार सिर्फ एफएस का उपयोग करके फाइलों को देखने के साथ कुछ क्रॉसप्लाउंडर मुद्दों को हल करता है।


3
क्या यह सबफ़ोल्डर्स को संभालता है?
Stepan Yakovenko

1
इसके साथ एक समस्या है - जब मैं एक बड़ी फ़ाइल की प्रतिलिपि बनाता हूं। ऐड ईवेंट तुरंत ट्रिगर हो जाता है और फिर फ़ाइल कॉपी में प्रगति के रूप में मुझे सैकड़ों परिवर्तन ईवेंट मिलते हैं। फ़ाइल कॉपी समाप्त होने पर केवल एक घटना को ट्रिगर करने का कोई तरीका?
20

5
@ Curious101, क्या आपने जोड़ने की कोशिश की है awaitWriteFinish: true? यह डिफ़ॉल्ट रूप से गलत है।
cs_pupil

मैं एक बात पूछना चाहता हूं, क्या यह बड़े फाइल सिस्टम पर उपयोग करने योग्य है, आप कह सकते हैं कि मैं मॉनिटर करना चाहता हूं /home/terabyte। खैर पुनरावर्ती नहीं
tbhaxor

42

सिर्फ पुराने का उपयोग क्यों न करें fs.watch? इसका बहुत सीधा है।

fs.watch('/path/to/folder', (eventType, filename) => {
console.log(eventType);
// could be either 'rename' or 'change'. new file event and delete
// also generally emit 'rename'
console.log(filename);
})

विकल्प के बारे में अधिक जानकारी और विवरण के लिए, नोड्स डॉक्स देखें


7
चेतावनी का ध्यान दें, मैंने इसे अपने मैक पर परीक्षण किया है, और यह कोड केवल उस फ़ोल्डर स्तर का पता लगाता है और परिवर्तनों के लिए कोई उपनिर्देशिका नहीं है, इसलिए सुनिश्चित करें कि दूसरे पैरामीटर के रूप में पुनरावृत्ति देखने के विकल्प को जोड़ना सुनिश्चित करें; ऊपर दिए गए डॉक्स देखें
OzzyTheGiant

1
@ OzzyTheGiant के नोट में जोड़ा गया नोट: पुनरावर्ती विकल्प केवल macOS और विंडोज पर समर्थित है।
कौशिक इवानी

नोड्स fs.watch()थोड़ा क्लूनी है, और आपको अपना जीता हुआ डेबिट कार्यान्वयन बनाना होगा।
mwieczorek

@mwieczorek 'पराजय' का क्या अर्थ है?
थॉमस जे रश

2
@ThomasJayRush एक ऐसा तंत्र है जो एक निश्चित मात्रा में समय और घटना और कार्रवाई के बीच गुजरने की अनुमति देता है, इसलिए यदि कोई घटना दो बार होती है, तो कार्रवाई केवल एक बार होती है। यह एक इंजीनियरिंग शब्द है जहां एक भौतिक बटन विद्युत प्रवाह को ट्रिगर करेगा, लेकिन बटन एक या अधिक बार "उछाल" करेगा, वर्तमान में कई स्पाइक्स का निर्माण करेगा जहां केवल एक वांछित था - जिसे प्रोग्रामिंग के लिए भी लागू किया जा सकता है - विशेष रूप से जेएस। medium.com/@jamischarles/what-is-debouncing-2505c0648ff1
mwieczorek

12

हाउंड आज़माएं :

hound = require('hound')

// Create a directory tree watcher.
watcher = hound.watch('/tmp')

// Create a file watcher.
watcher = hound.watch('/tmp/file.txt')

// Add callbacks for file and directory events.  The change event only applies
// to files.
watcher.on('create', function(file, stats) {
  console.log(file + ' was created')
})
watcher.on('change', function(file, stats) {
  console.log(file + ' was changed')
})
watcher.on('delete', function(file) {
  console.log(file + ' was deleted')
})

// Unwatch specific files or directories.
watcher.unwatch('/tmp/another_file')

// Unwatch all watched files and directories.
watcher.clear()

फ़ाइल बदलने के बाद यह निष्पादित होगा

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.