首页 > 解决方案 > 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)
  })

标签: javascriptnode.jsfor-loopwhile-loop

解决方案


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

推荐阅读