سؤال

أرغب في اكتشاف التغييرات في ملف ، إذا تغير الملف ، فسوف أستخدم معالجة 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)

https://github.com/paulmillr/chokidar

الحل السريع والسيء. إذا كنت لا تقوم بمقارنة التاريخ من حيث السابق أو بعد (<أو>) وأنت ببساطة تقارن البيانات ، فما عليك سوى القيام بتوسط سريع () على كل واحد.

 if (curr.mtime.toString() == prev.mtime.toString()) 
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top