精通
英语
和
开源
,
擅长
开发
与
培训
,
胸怀四海
第一信赖
本文原文来自: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方法来监视目标文件夹将看起来像这样...
很简单吧?当sim目录中的内容发生变化时,侦听器功能将记录发生的事件和受影响的文件名。所以返回也很简单。如果你想要更多,那么你必须自己去获取有关该文件的信息(这是非常方便的,它们为您更改文件名)。我们来看看上面代码的输出在以下情况下。
让我们在sim文件夹中添加一个名为test.txt的文件,看看结果。
Event: change
test.txt
Event: change
test.txt
Event: change
test.txt
现在让我们将test.txt重命名为blah.txt
Event: rename
blah.txt
Event: rename
blah.txt
现在我们来删除那个文件
现在我们来添加一个文件夹“新建文件夹”
现在我们重命名文件夹“测试文件夹”
Event: rename
Test Folder
最后,我们先行去删除文件夹
你可以看到,我们没有得到很多有用的信息。我们知道发生了一些事情,一般事件,有时是添加的文件/文件夹的名称。这适用于很多用途。当您监视单个文件而不是文件夹时,您会获得更好的结果,但仍然不是我需要的。我需要一些更好的信息。
所以看到如下条件适用,
DirectoryWatcher 模块(附在本文中,可在GitHub上使用)大量使用fs模块。它使用定时器的形式以合适的频率,用setInterval检查您正在监视的目录的,并可以递归检查任何子文件夹。我不建议在任何生产应用程序中使用它,因为它是由接纳的新手编写的模块,但我认为这是一个很好的起点。你可以看看大量评论的代码,看看我如何在休闲中详细地构建它。
该DirectoryWatcher模块导出一个对象(创造性地命名)DirectoryWatcher。该对象扫描给定的目录(如果recursive设置上,则检查子目录),并根据发现的内容引发六个事件。该DirectoryWatcher 还公开了directoryStructure,因为它扫描目录,会形成表示目录的视图。
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对象暴露了以下方法:
目前DirectoryWatcher触发六个事件,这些事件是:
有与此一个相关联的对象(包括在模块中)称为FileDetail,这个对象是通过下层fileAdded和fileChanged事件传递而来,并且也包含在directoryStructure对象内来表示目录中的文件。该FileDetail对象具有以下属性:
FileDetail对象还有一个方法compareTo(fileDetail),将当前FileDetail对象与传入的对象进行比较,并返回有关它是否不同的信息,以及如何不同。它返回的对象具有一个属性different,它是一个布尔值,指示文件是否不同,并且属性differences是发现的关联数组。
好的,现在我已经描述了上面的模块,我们来说明这个模块如何在一个非常简单的示例应用程序中使用。该示例将模仿我们刚刚使用该fs.watch 方法开始的应用程序。
使用的主要区别是我们必须捕获事件而不是传递给监听器函数...请参见下面的代码。
注意:我认为该DirectoryWatcher 模块位于与app.js代码相同目录中的名为“ modules ” 的文件夹中。(此示例包含在附加的代码文件和GitHub链接中。)
// 启动显示器,并检查更新
// 每半秒钟。
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文件夹中
现在让我们将test.txt重命名为blah.txt
现在我们来删除那个文件
现在我们来添加一个文件夹“New Folder”
现在我们重命名文件夹“测试文件夹”
我们继续吧,删除文件夹
最后让我们添加test.txt回到sim文件夹,然后修改它
我认为这比以前方法更多信息量。性能受到的影响可能会更大一点,但是首先要尝试...它可以将就用。
从这里开始,我可以构建一个监视目录的应用程序,什么事情发生变化时报告,或者使用此对象来构建一个应用程序,以便在处理文件之前将文件放在一个目录中。
我可以想到很多用途。我也相信你也可以。该模块必须重新构造一点点,错误处理被添加,但它可以工作。
我喜欢建立DirectoryWatcher,我希望这篇描述它的文章对你有帮助,附上的代码可以帮助你与我一起学习。