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

时间:2019-07-20 09:23:45

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

我希望使用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)
  })

1 个答案:

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