اكتشف تغييرات الملف في node.js عبر Fatchfile
-
25-09-2019 - |
سؤال
أرغب في اكتشاف التغييرات في ملف ، إذا تغير الملف ، فسوف أستخدم معالجة child_process لتنفيذ أمر SCP لنسخ الملف إلى خادم. افعل ، ولكن عندما جربته ، بطريقة ما لا تعمل كما كنت أتوقع. تم استخدام الكود التالي:
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 NOT Equal" (أنا فقط الوصول إلى الملف). المخرجات:
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
أي شخص يعرف لماذا فشل العبارة IF (حاول أيضًا استخدام === تحديد الشيك ، ولكن لا يزال يحصل على نفس الإخراج) عندما يكون اثنين من الوقت متماثلان؟
المحلول
إذا mtime
الخصائص Date
الكائنات ، ثم هذه لا يمكن أن تكون متساوية. في JavaScript ، يكون كائنين منفصلين متساويين فقط إذا كانت في الواقع نفس الكائن (تشير المتغيرات إلى نفس مثيل الذاكرة)
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
كائنات تاريخ الإخراج أو السلاسل ولكن يبدو بالتأكيد بهذه الطريقة من وصفك)
نصائح أخرى
للناس "ذكي":
if (curr.mtime - prev.mtime) {
// file changed
}
للأسف الطريقة الصحيحة
if (+curr.mtime === +prev.mtime) {}
+ يجبر كائن التاريخ إلى int وهو Unixtime.
لتبسيط الأشياء التي يمكنك استخدامها Watchr للحصول على أحداث مفيدة (سوف تطلق فقط change
الحدث إذا تغير ملف بالفعل). كما يدعم مشاهدة أشجار الدليل بأكملها :)
نحن نستخدم chokidar لمشاهدة الملفات ، والتي تعمل حتى في السياق المشكوك فيه لجهاز CentOS الذي يعمل باستخدام نظام ملفات Windows (Vagrant VirtualBox Centos يعمل على جهاز Windows)
الحل السريع والسيء. إذا كنت لا تقوم بمقارنة التاريخ من حيث السابق أو بعد (<أو>) وأنت ببساطة تقارن البيانات ، فما عليك سوى القيام بتوسط سريع () على كل واحد.
if (curr.mtime.toString() == prev.mtime.toString())