javascript - Node.js 文件系统 - 在添加新文件时读取文件夹中的文件
问题描述
我正在寻找使用 Node.js 读取文件夹中的文件。传入的文件是具有给定名称的文本文件(例如,“FishText1”)
该文件夹将不断添加新文件,并且这些新文件中的每一个都将始终称为“FishText”+ int。
目前,我只是使用它来对文本文件执行一项任务,在这种情况下将其移动到另一个文件夹(稍后在我的项目中,我将寻求通过这些文本文件执行搜索以查找某些字符串,但稍后会介绍并为此制定计划),目前有一些代码可以完美地做到这一点,见下文。[注意这是取自另一个线程上建议的代码,用户 'adotout',2013 年 7 月 30 日]
我的问题是,有没有比使用强制“while”循环更好的方法,当处理的.js 文件到达其列表的末尾时它将停止 - 即当添加新的文本文件时,我希望它们被处理也不必重新运行processed.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)
})
解决方案
“while”解决方案对 CPU 的要求很高,而且相当粗糙。
一种类似但更好的方法是“间隔”方法:
const elaborateFiles = setInteval(() => {
if (thereAreNewFiles()) {
elaborateFile()
}
if (allFileAreElaborated()) {
clearInterval(elaborateFiles)
}
}, 1000)
但我认为在这种情况下,您应该以事件驱动的方法为目标。
您可以在此处找到更多信息和一些示例:使用 node.js 监视文件夹的更改,并在更改时打印文件路径
在我们的例子中:
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)
})
推荐阅读
- java - 斯坦福核心 NLP NER 标记:DATE 和 DURATION 之间的区别
- java - 更改晕影校正的衰减半径(OpenCV Java)
- android - 如何从密钥库中提取十六进制格式的私钥
- azure - 逻辑应用自定义连接器 - 如何从最终用户那里获得客户端 ID 和密码?
- oauth-2.0 - CIBA 规范要求澄清
- dialog - 操作表对话框操作颜色
- .htaccess - 无法在 htaccess 中阻止机器人
- python - Xpath 选择器在遍历选择器列表时不会过滤掉类
- c# - 无法创建 XX.XX 类型的空常量值 此上下文仅支持实体类型、枚举类型或原始类型
- jakarta-ee - 仅在执行 POST 时忽略 JSON 字段