锐英源软件
第一信赖

精通

英语

开源

擅长

开发

培训

胸怀四海 

第一信赖

当前位置:锐英源 / 开源技术 / 网站前端开发中级 / 使用Node.JS监听目录下的文件和子目录变化
服务方向
人工智能数据处理
人工智能培训
kaldi数据准备
小语种语音识别
语音识别标注
语音识别系统
语音识别转文字
kaldi开发技术服务
软件开发
运动控制卡上位机
机械加工软件
软件开发培训
Java 安卓移动开发
VC++
C#软件
汇编和破解
驱动开发
联系方式
固话:0371-63888850
手机:138-0381-0136
Q Q:396806883
微信:ryysoft

使用Node.JS监听目录下的文件和子目录变化

本文原文来自:https://www.codeproject.com/Articles/699468/Monitoring-a-Folder-for-Changes-in-Files-and-Folde。源代码请到上面链接上自行下载。本文对链接里的英文关键位置进行了翻译,禁止转载,祝大家学习愉快,有更多问题请找锐英源孙老师,QQ396806883,微信ryysoft。


介绍

我潜心研究Node.js,把这篇心得奉献给大家。
我不得不说,使用JavaScript不仅仅支持DOM还支持更多,这非常有趣的。我(像许多开发人员一样),主要使用JavaScript来进行AJAX调用,并使网页更好一点,更灵敏。到目前为止,我从来没有真正将JavaScript视为对UI以外的任何东西都有用的东西。我真的开始重新评估这个立场。
在这篇特别的文章中,我开始研究Node.js的fs(File System)模块。对我来说,这是完全脱离我在JavaScript中做过的任何事情。我通常在服务器端使用其他一些技术(如C#或PowerShell)进行文件处理。
所以要求是:我需要一些方法来监视目录(以及可能的所有子目录),例如添加新文件,删除文件,修改文件,删除文件夹,文件夹,添加等更改。本文将重点介绍那个功能。
沟通报告(到目前为止的想法)
虽然本文不符合我自己的“入门”项目Sprint 2的所有要求,但我认为我试图在第一篇文章中覆盖太多,而不是一次重点关注一个。我将一次重点关注一个项目来尝试并纠正这一问题。嘿! 你永远不会知道,我的写作技巧可能会改善,而我的JavaScript / Node技能也会变好...新挑战来临了。
到目前为止,我已经学到了很少的模块,但还有很多东西要学习。可悲的是,当我像现在这样使用JavaScript时,我非常依赖jQuery和其他框架。这样做真的影响了我对JavaScript基础知识的了解,所以,像第一篇文章一样,我继续避免框架,直到我得到了Node和JavaScript领域里一个强大的领悟。当我这样使用框架,这是一个节省时间的方法,也没有多大支持。我仍然不是专家,不要假装,所以对于那些阅读这篇文章的朋友:意识到这是在“学习曲线”的格式,而不是作为一个专家尝试教新手...我就是关于JavaScript / Node的新手,所以请记住。需要C ++、C#、SQL或Assembly方面的背景知识:我是你的男人,可以从我的头顶回答很多问题... JavaScript / Node?我要划伤我的头,回答“我不知道,但我们一起去找”。
你可能注意到的一件事是我的编码风格在每篇文章之间变化。我正在努力使我的风格和惯例与大多数JavaScript代码保持一致,但这是与许多前期一直在做的做法和风格相抵触的。我已经发现了道格拉斯·克劳福德的JavaScript编程语言代码约定,我已经从中提取了一些提示,但是我自己的喜好闪过,可能不如一些风格细究者想要的。
我也开始讨论可变范围,关闭问题,以及JavaScript目前没有针对OOP这一事实,因为我现在很喜欢:我正在努力工作。其他问题就是实现Node / JavaScript是单线程的,并且使用非阻塞异步方法和回调函数处理后台进程。使用这篇特定文章附带的代码的东西对于让我思路加,这很重要。我不认为我甚至没有接近“掌握”这个概念,但我正在努力。
最后,在我们进入监控目录之前,我刚刚开始使用GitHub(我习惯于TFS / SourceSafe)。我把这篇文章的代码放在GitHub上,所以人们可以协作或分支。我希望能够更加熟悉git。
所以... 开始讲代码了!

监视(监视)具有节点的目录

Node.js的fs模块提供了一种方法<a title="fs.watch method" href="http://nodejs.org/docs/latest/api/fs.html#fs_fs_watch_filename_options_listener">fs.watch(filename, [options], [listener])</a>这是相当简单的使用。虽然文件(见链接)指出,这是不稳定的,它确实非常简单易用。
注意:由于我使用Visual Studio 的Node.js工具(因此,Windows(我知道,我知道,我可以听到一些纯粹主义者的嘶嘶声))我要假设你的机器上有一个文件夹,它像我这样做)命名为“ C:\ sim ”。您可以将代码修改为Linux上的“ / usr / whatever / whatever / ”,或者您希望指向计算机上的文件夹。示例代码,以及我在CentOS和Windows上编写的模块,您只需要修改一些路径。
所以:使用内置的Node.js fs.watch方法来监视目标文件夹将看起来像这样...


// 要求文件系统
fs = require("fs");
// 监视sim目录
fs.watch("c:\\sim", { persistent: true }, function (event, fileName) {
console.log("Event: " + event);
console.log(fileName + "\n");
});

很简单吧?当sim目录中的内容发生变化时,侦听器功能将记录发生的事件和受影响的文件名。所以返回也很简单。如果你想要更多,那么你必须自己去获取有关该文件的信息(这是非常方便的,它们为您更改文件名)。我们来看看上面代码的输出在以下情况下。

1.将文件添加到文件夹

让我们在sim文件夹中添加一个名为test.txt的文件,看看结果。


Event: rename
test.txt

Event: change
test.txt

Event: change
test.txt

Event: change
test.txt

现在让我们将test.txt重命名为blah.txt


Event: rename
null

Event: rename
blah.txt
Event: rename
blah.txt

现在我们来删除那个文件


Event: rename
null

现在我们来添加一个文件夹“新建文件夹”


Event: rename
New Folder

现在我们重命名文件夹“测试文件夹”


Event: rename
null

Event: rename
Test Folder

最后,我们先行去删除文件夹


Event: rename
null

你可以看到,我们没有得到很多有用的信息。我们知道发生了一些事情,一般事件,有时是添加的文件/文件夹的名称。这适用于很多用途。当您监视单个文件而不是文件夹时,您会获得更好的结果,仍然不是我需要的。我需要一些更好的信息。

DirectoryWatcher分析

所以看到如下条件适用,

  1. 该fs.watch方法并不完全符合我的要求,
  2. 我试图学习如何使用JavaScript / Node而不是其他技术来做这些事情,
  3. 这似乎是完美的学习体验机会,而且
  4. 我稍微偏离了我的目标...我决定“滚我自己”的解决方案。

DirectoryWatcher 模块(附在本文中,可在GitHub上使用)大量使用fs模块。它使用定时器的形式以合适的频率,用setInterval检查您正在监视的目录的,并可以递归检查任何子文件夹。我不建议在任何生产应用程序中使用它,因为它由接纳的新手编写的模块,但我认为这是一个很好的起点。你可以看看大量评论的代码,看看我如何在休闲中详细地构建它。

描述DirectoryWatcher

该DirectoryWatcher模块导出一个对象(创造性地命名)DirectoryWatcher。该对象扫描给定的目录(如果recursive设置上,则检查子目录),并根据发现的内容引发六个事件。该DirectoryWatcher 还公开了directoryStructure,因为它扫描目录,会形成表示目录的视图。

DirectoryWatcher构造函数

DirectoryWatcher 有一个构造函数,DirectoryWatcher(root, recursive) 其中root是要监视的目录的路径,递归确定它是否监视子文件夹(true =监视子项,false =它不)。
所以当你创建一个新的对象时DirectoryWatcher,你会这样做。


// Imports / Requires
var dirwatch = require("./modules/DirectoryWatcher.js");

// 创建一个监控对象,将监视目录
// 和所有它在这种情况下子目录(递归)
// 我们假设你是一个Windows机器上的一个文件夹
// 在c盘名为“SIM”。
// 应该在linux和windows上工作,更新路径
// 到你自己的一些适当的测试目录。
//通过简单地改变递归参数目录为假
//你只能监控一个文件夹,却没有子目录
var simMonitor = new dirwatch.DirectoryWatcher("C:\\sim", true);

DirectoryWatcher属性

该DirectoryWatcher对象具有以下属性:

  1. root:正在监视的目录的基本目录路径
  2. recursive:确定是否监视该目录的子文件夹以及根目录
  3. directoryStructure表示扫描结构的对象及其文件的详细信息
  4. timer:该对象实例的当前计时器
  5. suppressInitialEvents:确定第一次DirectoryWatcher 扫描一个目录(何时.start() 被调用)触发事件

DirectoryWatcher的暴露方法

DirectoryWatcher对象暴露了以下方法:

  1. scanDirectory(dir, suppressEvents):主扫描方式。试图尽可能地以非阻塞模式工作。扫描给定的目录,然后尝试在目录中记录每个文件。
    1. dir =要扫描的目录
    2. suppressEvents =禁止任何会引发此扫描迭代的事件
    3. true =事件将被抑制
    4. false =事件将会提高。
      注意:在大多数情况下,我并不真正看到有理由直接使用这种方法start(interval),stop()而是使用和替代。
  2. start(interval):启动DirectoryWatcher 监视给定根路径的此实例(创建对象时设置),并定义检查更改的间隔。
    1. interval =给定受监控目录的更新检查之间的时间(以毫秒为单位)。
  3. stop():停止DirectoryWatcher 观察变更的这个实例

DirectoryWatcher触发的事件

目前DirectoryWatcher触发六个事件,这些事件是:

  1. fileAdded:将文件添加到受监视的文件夹时引发。它还将传回FileDetail描述已添加文件的对象。
  2. fileChanged:文件更改时引发。它也将传回一个FileDetail 描述已更改的文件,并描述一个关联数组对象物体是什么 究竟已经改变。
  3. fileRemoved:文件被删除时提起。还将完整路径传回到已删除的文件。
  4. folderAdded:当文件夹已添加到受监控目录时引发,也将路径传回到刚刚添加的文件夹。(仅在递归模式下触发
  5. folderRemoved:当文件夹已被从受监视的目录或其中一个子文件夹移除时引发,还会将路径传回到已删除的文件夹。(仅在递归模式下触发
  6. scannedDirectory:募集每次目录已经完全扫描(这一个触发很多)

相关对象: FileDetail

有与此一个相关联的对象(包括在模块中)称为FileDetail,这个对象是通过下层fileAdded和fileChanged事件传递而来,并且也包含在directoryStructure对象内来表示目录中的文件。该FileDetail对象具有以下属性:

  1. directory:文件的父目录
  2. fullPath:包含文件目录的整个路径。
  3. fileName:只是没有路径的文件的名称
  4. size:文件的大小(以字节为单位)
  5. extension:文件的扩展名(.js,.txt等)
  6. accessed:文件的最后访问日期
  7. modified:文件的最后修改日期
  8. created:文件的最后创建日期

FileDetail对象还有一个方法compareTo(fileDetail),将当前FileDetail对象与传入的对象进行比较,并返回有关它是否不同的信息,以及如何不同。它返回的对象具有一个属性different,它是一个布尔值,指示文件是否不同,并且属性differences是发现的关联数组。

把它放在一起(使用代码)

好的,现在我已经描述了上面的模块,我们来说明这个模块如何在一个非常简单的示例应用程序中使用。该示例将模仿我们刚刚使用该fs.watch 方法开始的应用程序。
使用的主要区别是我们必须捕获事件而不是传递给监听器函数...请参见下面的代码。
注意:我认为该DirectoryWatcher 模块位于与app.js代码相同目录中的名为“ modules ” 的文件夹中。(此示例包含在附加的代码文件和GitHub链接中。)


// Imports / Requires
var dirwatch = require("./modules/DirectoryWatcher.js");
// 创建一个监控对象,将监视目录
// 和所有它在这种情况下子目录(递归)
// 我们假设你是一个Windows机器上的一个文件夹
// 在c盘名为“SIM”。
// 应该在linux和windows上工作,更新路径
// 到你自己的一些适当的测试目录。
// 通过简单地改变递归参数目录为假
// 你只能监控一个文件夹,却没有孩子
var simMonitor = new dirwatch.DirectoryWatcher("C:\\sim", true);

// 启动显示器,并检查更新
// 每半秒钟。
simMonitor.start(500);

// 将文件删除时登录到控制台
simMonitor.on("fileRemoved", function (filePath) {
console.log("File Deleted: " + filePath);
});

// 将文件夹删除后登录到控制台
simMonitor.on("folderRemoved", function (folderPath) {
console.log("Folder Removed: " + folderPath);
});

// 添加文件夹时登录控制台
simMonitor.on("folderAdded", function (folderPath) {
console.log("Folder Added: " + folderPath);
});

// 更改文件时登录控制台。
simMonitor.on("fileChanged", function (fileDetail, changes) {
console.log("File Changed: " + fileDetail.fullPath);
for (var key in changes) {
console.log("  + " + key + " changed...");
console.log("    - From: " + ((changes[key].baseValue instanceof Date) ?
changes[key].baseValue.toISOString() : changes[key].baseValue));
console.log("    - To  : " + ((changes[key].comparedValue instanceof Date) ?
changes[key].comparedValue.toISOString() : changes[key].comparedValue));
}
});

// 添加文件时登录控制台。
simMonitor.on("fileAdded", function (fileDetail) {
console.log("File Added: " + fileDetail.fullPath);
});

// 让我们知道目录监控正在发生,哪里。
console.log("Directory Monitoring of " + simMonitor.root + " has started");

现在,我们运行上面的示例应用程序,并在sim目录中执行与之前相同的操作。
1.将一个名为test.txt的文件添加到sim文件夹中


Directory Monitoring of C:\sim has started
File Added: C:\sim\test.txt

现在让我们将test.txt重命名为blah.txt


File Added: C:\sim\blah.txt
File Deleted: C:\sim\test.txt

现在我们来删除那个文件


File Deleted: C:\sim\blah.txt

现在我们来添加一个文件夹“New Folder”


Folder Added: C:\sim\New Folder

现在我们重命名文件夹“测试文件夹”


Folder Removed: C:\sim\New Folder
Folder Added: C:\sim\Test Folder

我们继续吧,删除文件夹


Folder Removed: C:\sim\Test Folder

最后让我们添加test.txt回到sim文件夹,然后修改它


File Changed: C:\sim\test.txt
  + size changed...
    - From: 51
    - To  : 112
  + modified changed...
    - From: 2013-12-21T03:15:02.000Z
    - To  : 2013-12-21T03:15:31.000Z

我认为这比以前方法更多信息量。性能受到的影响可能会更大一点,但是首先要尝试...它可以将就用。
从这里开始,我可以构建一个监视目录的应用程序,什么事情发生变化时报告,或者使用此对象来构建一个应用程序,以便在处理文件之前将文件放在一个目录中。
我可以想到很多用途。我也相信你也可以。该模块必须重新构造一点点,错误处理被添加,但它可以工作。

最后的想法

我喜欢建立DirectoryWatcher,我希望这篇描述它的文章对你有帮助,附上的代码可以帮助你与我一起学习。

友情链接
版权所有 Copyright(c)2004-2021 锐英源软件
公司注册号:410105000449586 豫ICP备08007559号 最佳分辨率 1024*768
地址:郑州大学北校区院(文化路97号院)内