我希望使用Node.js读取文件夹中的文件。 传入文件是具有给定名称的文本文件(例如'FishText1')
该文件夹将不断添加新文件,并且每个新文件都将始终称为“ FishText” + int。
当前,我只是用它来对文本文件执行任务,在这种情况下,将其移动到另一个文件夹(在我的项目中,我希望通过这些文本文件搜索某些字符串,但是会得到到以后再有一个计划),目前有一些代码可以完美地做到这一点,请参阅下文。 [注意:这取自用户'adotout'在2013年7月30日在另一个线程上建议的代码]
我的问题是,有没有比使用强制的“ while”循环更好的方法,当“ processed.js”文件到达其列表末尾时,该循环将停止-即,当添加新文本文件时,我希望也可以处理,而不必重新运行processing.js。
其他信息: 我知道这不是执行此操作的最优雅的方法,因此在简化过程中的任何帮助也将不胜感激,因为这正在成为更大项目的一部分。 文件本身总是小于1kb,但是每小时可能需要数千个文件,需要处理。要求是对它们进行“实时”处理,而不是等到完成之后再处理所有这些。
var fileExist = true;
var fileNumber = 1;
while (fileExist) {
** Not my actual code **
** Work PC is at work and I dont have a local copy **
if __DIR/FishText + fileNumber + .txt
Write __NewDIR/NewText + fileNumber + .xml
fileNumber++
else
error message to console
}
当前结果符合预期-我可以将所有文件移到新的目标文件夹中,但是如果在运行'processor.js'之后添加了新文件,则必须再次运行它。
因此,我尝试了“ Chokidar”方法,但似乎无法运行任何代码-甚至没有在Atom(我用来编写代码)中运行。 请参阅下面的完整代码,并省略目录。
当我运行代码'processor.js'时,命令行会跳到新行,就好像它已经在运行该进程一样,但是我看不到代码的输出,我希望看到一些东西,就像我已经特意在其中包含一行,将文件打印出来以供控制台使用。
var processedFileNumber = 1;
var chokidar = require('chokidar')
var watcher = chokidar.watch('__DIR', {ignored: /^\./, persistant: true})
watcher
.on('add', function(path) {
const file = readFile ('__DIR/file ' + processedFileNumber + '.txt', 'utf8');
console.log("Print something");
writeFile('__DIR/fileXML ' + processedFileNumber + '.xml', data);
processedFileNumber++;
})
.on('error', function(error) {
console.error('Error Happened', error)
})
答案 0 :(得分:2)
“ while”解决方案对CPU的要求很高,而且相当粗糙。
一种类似但更好的方法是“间隔”:
const elaborateFiles = setInteval(() => {
if (thereAreNewFiles()) {
elaborateFile()
}
if (allFileAreElaborated()) {
clearInterval(elaborateFiles)
}
}, 1000)
但是我认为在这种情况下,您应该针对事件驱动的方法。
您可以在此处找到更多信息和一些示例:Watch a folder for changes using node.js, and print file paths when they are changed
在我们的情况下:
var chokidar = require('chokidar')
var watcher = chokidar.watch('file or dir', {ignored: /^\./, persistent: true})
watcher
.on('add', function(path) {
const file = readFile(path)
elaborateFile(file)
})
.on('error', function(error) {
console.error('Error happened', error)
})
编辑:
我认为您在ignored
选项上遇到了问题。这项工作完全可以在我的电脑上进行:
const fs = require('fs')
const chokidar = require('chokidar')
const watcher = chokidar.watch('./folder')
watcher
.on('add', (path) => {
console.log('path', path)
const file = fs.readFileSync(path)
console.log('\nfile')
console.log(file.toString())
})
.on('error', (error) => {
console.error('error', error)
})