Xem thư mục để biết các thay đổi bằng cách sử dụng node.js và in đường dẫn tệp khi chúng được thay đổi


87

Tôi đang cố gắng viết một tập lệnh node.js để theo dõi các thay đổi trong thư mục tệp, sau đó in các tệp bị thay đổi. Làm cách nào để sửa đổi tập lệnh này để nó xem một thư mục (thay vì một tệp riêng lẻ) và in tên của các tệp trong thư mục khi chúng được thay đổi?

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?
});

Tôi tự hỏi liệu điều này có liên quan không: stackoverflow.com/questions/12063266/… (Tuy nhiên, tôi không quen thuộc với gruntjs - tôi hy vọng có các giải pháp khác.)
— Anderson Green

Có lẽ một cái gì đó như node-inotify-plusplus sẽ hữu ích: stackoverflow.com/questions/5877263/…
— Anderson Green

Bạn đang chạy hệ điều hành nào? Điều này quan trọng vì các cơ chế cấp thấp để xem tệp rất khác nhau khi sử dụng Unix / Linux inotify, sử dụng OSX FSWatchvà tôi không biết gì về Windoze nhưng tôi chắc rằng Google có thể cho bạn biết.
— srquinn

1
Mặc dù ban đầu tôi sử dụng đồng bằng node-inotifytrong dự án của mình, nhưng cuối cùng tôi đã chuyển sang sử dụng node-inotify-plusplusvì ai không thích trừu tượng? =)
— srquinn

Câu trả lời:


145

Hãy thử Chokidar :

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);})

Chokidar giải quyết một số vấn đề về biểu mẫu chéo khi xem tệp chỉ bằng fs.


3
Nó có xử lý các thư mục con không?
— Stepan Yakovenko

1
Một vấn đề với điều này - Khi tôi sao chép một tệp lớn. Sự kiện thêm được kích hoạt ngay lập tức và sau đó tôi nhận được hàng trăm sự kiện thay đổi khi quá trình sao chép tệp diễn ra. Có cách nào để chỉ kích hoạt một sự kiện khi bản sao tệp kết thúc không?
— Curious101

5
@ Curious101, bạn đã thử thêm awaitWriteFinish: truechưa? Nó sai theo mặc định.
— cs_pupil

Tôi muốn hỏi một điều, nó có xứng đáng để sử dụng trên hệ thống tệp lớn không, bạn có thể nói tôi muốn theo dõi /home/terabyte. Cũng không đệ quy
— tbhaxor

42

Tại sao không chỉ sử dụng cái cũ fs.watch? Nó khá đơn giản.

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);
})

Để biết thêm thông tin và chi tiết về thông số tùy chọn, hãy xem Node fs Docs


7
Lưu ý cảnh báo, tôi đã thử nghiệm điều này trên máy mac của mình và mã này chỉ phát hiện cấp thư mục đó chứ không phải bất kỳ thư mục con nào để thay đổi, vì vậy hãy đảm bảo thêm tùy chọn xem đệ quy làm tham số thứ hai; xem các tài liệu được liên kết ở trên
— OzzyTheGiant

1
Đã thêm ghi chú vào Lưu ý của @ OzzyTheGiant: Tùy chọn đệ quy chỉ được hỗ trợ trên macOS và Windows.
— Kaushik Evani,

Node's fs.watch()hơi phức tạp và bạn phải xây dựng triển khai debounce đã thắng của mình.
— mwieczorek

@mwieczorek 'debounce' nghĩa là gì?
— Thomas Jay Rush

2
@ThomasJayRush một cơ chế cho phép một khoảng thời gian nhất định để trôi qua giữa sự kiện và hành động diễn ra, vì vậy nếu một sự kiện kích hoạt hai lần, thì hành động chỉ được gọi một lần. Đó là một thuật ngữ kỹ thuật trong đó một nút vật lý sẽ kích hoạt dòng điện, nhưng nút sẽ "nảy" một hoặc nhiều lần, tạo ra nhiều lần dòng điện mà chỉ một lần mong muốn - cũng có thể áp dụng cho lập trình - đặc biệt là JS. medium.com/@jamischarles/what-is-debouncing-2505c0648ff1
— mwieczorek

12

thử chó săn :

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()

Nó sẽ thực thi sau khi tệp thay đổi

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookie và Chính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.