2016-12-02 9 views
1

App lädt die Textdateien des Benutzers, und jeder von ihnen kann vom Benutzer geändert werden. Beim Start der App möchte ich überprüfen, ob eine Datei seit dem letzten Mal geändert wurde. Ich denke, der effizienteste Weg besteht darin, die Prüfsumme jeder Datei zu berechnen und in einer JSON-Datei zu speichern. Am App-Start werde ich jede Datei Prüfsumme überprüfen und mit Daten aus JSON-Datei vergleichen Gibt es eine weitere optimale/effiziente Möglichkeit, dies zu tun? Oder wie genau Dateiprüfsumme berechnen?NodeJS erkennt geänderte Dateien

+0

Wäre es nicht einfacher sein, den letzten Änderung Zeitstempel der Datei zu überprüfen? –

Antwort

1

Ich glaube, die Verwendung von fs.stat und überprüfen 'zuletzt geändert' ist viel schneller als das Lesen der gesamten Datei und Vergleichen der Prüfsumme, da es nur Metadaten (und Sie nicht wirklich die gesamte Datei lesen).

Wenn sich Ihre Dateien in verschiedenen Verzeichnissen befinden, können Sie testen, ob ein Ordner geändert wurde. Dadurch können E/A-Aufrufe reduziert werden (falls sich das letzte Änderungsdatum nicht geändert hat, können Sie die Überprüfung der Dateien in diesem Ordner überspringen).

Sie müssen das Datum der letzten Änderung speichern, ich würde Redis dafür verwenden. Sie müssen es bei jeder Modifikationsänderung und beim ersten Lauf natürlich aktualisieren.

hier ist eine Funktion (und ein Funktionsaufruf) zu testen, ob eine Datei oder einen Ordner geändert wurde:

let fs = require('fs'); 
let moment = require('moment'); 

let path = 'views'; //your folder path (views is an example folder) 
wasFileChanged(path, (err,wasChanged) => { 
    if (wasChanged){ 
    console.log('folder was changed, need to compare files'); 
    //need to update redis here 
    //...comapre files to find what was changed 
    } 
    else{ 
    console.log('folder was not changed'); 
    } 
}); 

/** 
* Checks if a file/folder was changed 
*/ 
function wasFileChanged(path, callback) { 
    fs.open(path, 'r', (err, fd) => { 
    if (err) { 
     return callback (err); 
    } else { 

     //obtain previous modified date of the folder (I would use redis to store/retrieve this data) 
     let lastModifed = '2016-12-03T00:41:12Z'; //put the string value here, this is just example 

     fs.stat(path, (err, data) => { 
     console.log('check if file/folder last modified date, was it after my last check '); 

     //I use moment module to compare dates 
     let previousLMM = moment(lastModifed); 
     let folderLMM = moment(data.mtime.toISOString()); 
     let res = !(folderLMM.isSame(previousLMM, 'second')); //seconds granularity 
     return callback (null, res); 
     }); 
    } 
    }); 
} 
+0

Ja, das ist eine Idee. Ich wusste, dass es etwas geben sollte, das mich nicht zwingt, jede Datei zu lesen, und "lastModifies" passt sehr gut für meine Zwecke. Ich würde mit Ihnen über diesen Code arque, aber Idee ist genug für mich: p Danke –

+0

Wie kann ich testen, ob ein Ordner geändert wurde? mtime eines Ordners ändert sich nicht, wenn der Inhalt einer darin enthaltenen Datei geändert wird: https://stackoverflow.com/questions/3620684/directory-last-modified-date –

+1

@SidVishnoi Um zu überprüfen, ob ein Ordner geändert wurde, können Sie Überprüfen Sie zunächst mtime (was ausreicht, wenn Dateien/Ordner hinzugefügt/entfernt wurden), dann verwenden Sie fs, um die Liste der Dateien zu erhalten und zu überprüfen, ob eine vorhandene Datei geändert wurde. Wenn mtime UND alle vorhandenen Dateien nicht geändert wurden, dann war der Ordner nicht. – RLaaa

2

sSeems wie dieses Blog ist eine gute Lektüre für Sie: http://blog.tompawlak.org/calculate-checksum-hash-nodejs-javascript

Code Beispiel (aus dem Blog):

var crypto = require('crypto'); 

function checksum (str, algorithm, encoding) { 
    return crypto 
     .createHash(algorithm || 'md5') 
     .update(str, 'utf8') 
     .digest(encoding || 'hex') 
} 

Um aus einer Datei zu lesen und seinen Hash präsentieren:

fs.readFile('test.dat', function (err, data) { 
    checksum(data);   // e53815e8c095e270c6560be1bb76a65d 
    checksum(data, 'sha1'); // cd5855be428295a3cc1793d6e80ce47562d23def 
}); 

Vergleichen Sie die Prüfsumme, um festzustellen, ob eine Datei geändert wurde, und Sie können auch vergleichen, wenn die Datei zuletzt geändert wurde, indem Sie fs.stat

0 verwenden
+0

Ich habe das gesehen, bin mir aber nicht sicher. Es wird eine Menge Dateien laden, und wirklich alle zu lesen scheint nicht die beste Option zu sein. Ich habe Angst vor der Effizienz davon. Vielleicht gibt es etwas passenderes für meinen Fall –

+0

@ PiotrWójcik node.js kann [crypto] (https://nodejs.org/api/crypto.html) Unterstützung eingebaut haben. Das Überprüfen auf seine Verfügbarkeit ist die zweite Kugel in der Verbindung . – traktor53

Verwandte Themen