• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Frage Dateien in Ordner auf Änderungen prüfen...

PlatinSecurity

Neues Mitglied
Hallo zusammen,

ich stehe aktuell vor einem Problem, bezüglich oben genanntes Thema. Konkret ehr, eine Datei zu erkennen, die gerade bearbeitet werden soll.
Ich hoffe, ich bin im richtigen Thema, da es hier auch um "Node.JS" handelt oder ehr eine Konsolenanwendung am ende ist, die im Hintergrund auf das hören soll, was im Code halt definiert ist.

Hier einmal mein aktueller Code:
const fs = require('fs');
const path = require('path');
const config = JSON.parse(fs.readFileSync('config.json', 'utf8'));
const watchedFile = 'test.txt'; // Das möchte ich Dynamisch erkennen...
const cacheFileName = watchedFile;
const pathToWatch = config.read_verzeichnis;
const cachePath = path.join(pathToWatch, config.cache_verzeichnis);
if (!fs.existsSync(cachePath)) {
try {
fs.mkdirSync(cachePath, { recursive: true });
} catch (error) {
console.log(`Fehler beim Erstellen des Cache-Verzeichnisses: ${error}`);
}
}
function readContent(filePath) {
try {
return fs.readFileSync(filePath, 'utf8');
} catch (err) {
console.error(`Fehler beim Lesen der Datei ${filePath}: ${err}`);
return null;
}
}
function copyDirectoryStructure(sourceDir, targetDir) {
try {
const items = fs.readdirSync(sourceDir);
for (const item of items) {
if (item !== config.cache_verzeichnis) {
const sourcePath = path.join(sourceDir, item);
const targetPath = path.join(targetDir, item);
const stats = fs.statSync(sourcePath);

if (stats.isDirectory()) {
if (!fs.existsSync(targetPath)) {
fs.mkdirSync(targetPath);
}
copyDirectoryStructure(sourcePath, targetPath);
} else if (stats.isFile()) {
if (!fs.existsSync(targetPath)) {
fs.copyFileSync(sourcePath, targetPath);
}
}
}
}
} catch (error) {
console.log(`Fehler beim Kopieren der Verzeichnisstruktur: ${error}`);
}
}
copyDirectoryStructure(pathToWatch, cachePath);
let currentContent = readContent(path.join(pathToWatch, watchedFile));
fs.watch(pathToWatch, (eventType, filename) => {
if (filename === watchedFile && eventType === 'change') {
if (!fs.existsSync(cachePath)) {
fs.mkdirSync(cachePath);
}
const filePath = path.join(pathToWatch, filename);
const newContent = readContent(filePath);

if (newContent !== null && newContent !== currentContent) {
const cacheFilePath = path.join(cachePath, cacheFileName);
fs.writeFileSync(cacheFilePath, currentContent, 'utf8');
console.log(`Die Datei ${cacheFileName} wurde gespeichert.`);
currentContent = newContent;
}
}
});
Es wird hier (aktuell fest) "test.txt" als zu prüfende Datei genommen. Das alles funktioniert auch einwandfrei. Es wird die Ordnerstruktur, sowie die Dateien Kopiert und ignoriert wird natürlich das "cache_verzeichnis" damit keine Endlosschleife entsteht.

Am ende ist ein "fs.watch" der darauf wartet, im angegebenen "read_verzeichnis" eine Änderung zu erkennen. Hier aktuell leider nur "test.txt".
Wenn "test.txt" abgeändert wurde, wird der alte Inhalt in die Datei im "cache_verzeichnis" gespeichert. Der Nutzen ist, wenn man bspw. keine Möglichkeit mehr hat "Strg + Z" zu machen, dass man diese Datei einfach wieder nehmen kann.

Wie man sicher erkennen konnte, geht es mir darum, dass ich gerne den Teil mit >> const watchedFile = 'test.txt'; << so haben möchte, dass auch wirklich jede Datei in dem zu überprüfenden Ordner ("read_verzeichnis") auf Änderung geprüft wird und der alte Inhalt in die richtige Datei im "cache_verzeichnis" gespeichert wird.

Ich hatte schon versucht das im "fs.watch" durch "filename" zu ermitteln, aber hier wäre es schon zu spät, da er dann den gespeicherten Inhalt einfach nimmt und auch in die Datei bei "cache_verzeichnis" schreibt. Also wäre es hier nur eine "Kopie" von einer Datei die ich eh schon habe.

Wichtig noch zu sagen:
Es ist nicht immer eine .txt ... Es kann auch mal eine .log oder .csv oder .mapx Datei sein. Nur damit sich nicht auf ".txt" festgehalten wird.

Ich hoffe ihr könnt mir folgen, was genau mein Anliegen ist und habt vielleicht auch eine Lösung oder eine bessere Idee?!

Vielen Dank.
 
Kein Plan was deine Mission ist aber das war sicherlich nicht hilfreich. :)
Vielleicht nicht für dich, aber für andere.

Dies habe ich aus einem anderen Forum kopiert:

Crossposting bedeutet, dass ein und dieselbe Frage in mehreren Foren oder Newsgroups gleichzeitig gestellt wird. Ein solches Verhalten wird von den meisten Helfern nicht toleriert, denn damit stellst Du einerseits die Kompetenz der Helfer jedes einzelnen Forums und Newsgroup in Frage und bewirkst zudem, dass ein zig-faches an Stunden aufgewendet wird, um nur ein einziges Problem zu lösen, denn überall werden sich die Helfer daran setzen, eine Lösung für Dich zu finden. Das ist ganz klar ein Missbrauch an dem kostenlosen und freiwilligen Support, der hier angeboten wird. Wenn Deine Frage klar und deutlich gestellt wurde, dann wirst Du ganz bestimmt innerhalb kürzester Zeit eine Antwort erhalten. Sollte dies auch nach mehreren Tagen nicht der Fall sein, dann versuche bitte die Frage besser zu formulieren. Falls Du dennoch in einem zweiten Forum posten solltest, erwähne bitte, dass Du die Frage schon woanders gestellt hast, und dass Du es tust, weil keine Lösung gefunden werden konnte.
 
Wie ich sehe, gibt es glob, ebenso wie in PHP, auch in nodejs. Damit müsstest Du dein Vorhaben umsetzen können:

Edit, oder wie es hier mit chokadir beschrieben wird:
 
Wie ich sehe, gibt es glob, ebenso wie in PHP, auch in nodejs. Damit müsstest Du dein Vorhaben umsetzen können:
Das kannte ich tatsächlich noch nicht und werde es mir mal durchlesen.

Edit, oder wie es hier mit chokadir beschrieben wird:
chokadir - Kannte ich schon und war auch schon anfangs in Benutzung bis hin zu dem jetzigen Code.

Aber danke. Ich versuch mal das "glob" ding / schau es mir zumindest an.
 
chokadir - Kannte ich schon und war auch schon anfangs in Benutzung bis hin zu dem jetzigen Code.
Und woran ist es dann gescheitert? Scheint doch laut Stackoverflow das Mittel der Wahl zu sein.

Was auf eine Lösung mit glob weniger zutrifft: Du müsstest die Dateiliste damit ermitteln und dann das Überwachen für jede einzelne Datei beginnen. Und würdest nicht mit bekommen, wenn eine Datei hinzu kommt oder gelöscht wird.
 
Zurück
Oben