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
Antwort
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);
});
}
});
}
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 –
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 –
@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
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
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 –
@ 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
- 1. Wie erkennt CMake geänderte Dateien
- 2. Robocopy ausgenommen geänderte Dateien
- 3. Django-Speicher erkennt keine geänderten statischen Dateien
- 4. Meine Eclipse-IDE erkennt geänderte Dateien in der Git-Perspektive nicht?
- 5. Git-Liste geänderte Dateien ohne Änderungen Zeilenenden
- 6. Get ANT scp nur neue/geänderte Dateien
- 7. SFTP bekomme zuletzt erstellte/geänderte Dateien
- 8. zuletzt geänderte Dateien wurden nur verschoben?
- 9. Git pre-commit hook: geänderte/hinzugefügte Dateien
- 10. C Makefile - nur geänderte Dateien neu kompilieren
- 11. Wie git Rebase nur geänderte Dateien
- 12. git nur einige geänderte Dateien hinzufügen
- 13. Vorübergehend verstecken einige geänderte Dateien in Git
- 14. Jenkins SSH Plugin, nur geänderte Dateien übertragen
- 15. NodeJS, socketIO, mehrere Dateien
- 16. nodejs Unlink-Dateien fs
- 17. NodeJS - Mehrere Router-Dateien
- 18. Firefox erkennt keine Zip-Dateien
- 19. Befehlsskript erkennt Dateien als Verzeichnisse
- 20. NodeJS Express Passport mehrere Dateien
- 21. BASH: Zeige zuletzt geänderte Dateien mit Datum geändert
- 22. Visual Studio 2012 - aktuelle und geänderte Dateien anzeigen?
- 23. Grunt Watch Event mit Grunt Copy für nur geänderte Dateien
- 24. ist es möglich, nur geänderte Dateien zu "git status"?
- 25. Git E-Mail-Hook, Commit-Nachricht und geänderte Dateien enthalten
- 26. Powershell Copy-Item, sondern kopieren Sie nur geänderte Dateien
- 27. Highlight geänderte Dateien in Dateibaum in Visual Studio Code
- 28. Laufpylint gegen nur geänderte Zeilen/Dateien mit jenkins
- 29. Copyright-Header über geänderte Dateien in einem Projekt aktualisieren
- 30. gulp-changed filtert nicht geänderte Dateien nicht aus
Wäre es nicht einfacher sein, den letzten Änderung Zeitstempel der Datei zu überprüfen? –