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