javascript - Node.js 文件系统 - 添加新文件时读取文件夹中的文件

标签 javascript node.js for-loop while-loop

我希望使用 Node.js 读取文件夹中的文件。 传入的文件是文本文件,具有给定名称(例如“FishText1”)

该文件夹将不断添加新文件,并且每个新文件将始终被称为“FishText”+ int。

目前,我只是用它来对文本文件执行任务,在本例中将其移动到另一个文件夹(稍后在我的项目中,我将希望通过这些文本文件执行搜索以查找某些字符串,但会得到稍后并为此制定计划),目前有一些代码可以完美地完成此操作,请参见下文。 [注意,这是取自用户“adotout”在 2013 年 7 月 30 日在另一个线程上建议的代码]

我的问题是,有没有比使用强制“while”循环更好的方法,当processed.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)

但我认为在这种情况下,您应该以事件驱动的方法为目标

您可以在此处找到更多信息和一些示例: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)
    })

编辑:

我认为您对忽略选项有疑问。这在我的电脑上完美运行:

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)
    })

关于javascript - Node.js 文件系统 - 添加新文件时读取文件夹中的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57123377/

相关文章:

loops - 在 VHDL 中使用带有变量的 FOR 循环

javascript - getElementById 但占位符?

javascript - 使用 jQuery Ajax 设置 PHP session 变量

javascript - HTML 文档中的选择元素不显示

javascript - 异步 waterfall 无法正确保存 Mongoose

node.js - sails JS : Setting autoPK:false still generates mongodb's id attribute

batch-file - 如何列出除一个以外的所有目录?

javascript - console.log 在分配给新变量时崩溃?

node.js - 有没有办法防止Windows命令行中的env变量扩展百分比?

java - for循环变量声明中允许的类型?