如何在 node.js 服务器和 node.js 应用程序之间同步文件夹
how to folder synch between a node.js server and node.js application
node.js 客户端应用程序需要将文件夹与远程 node.js 服务器同步。 windows 上都是 运行。
同步只需要是单向的,从服务器到客户端,并且知道何时完成的某种方式会很好。带宽不是关键考虑因素,如果有部分更改,可以重新下载整个文件。就频率而言,例如 15 分钟的批量更新尝试就可以了。
传递文件夹内容的 xml 表示并下载每个更改的文件,最好说什么方法或库?
谢谢
您正在寻找 dropbox 的克隆,它将监视文件的更改等,所以我建议:
我能想到的编写您自己的单个文件目录的单向同步的最简单方法如下:
客户端收集当前拥有的文件列表和每个文件的一些识别版本信息(版本号、CRC、原始文件创建时间-日期)。
客户端在 ajax 请求中将该列表发送到服务器。
服务器接收客户端文件列表并将其与自己的文件列表进行比较。然后它 returns 返回客户端三个文件列表:1) 通过下载最新版本更新的文件,2) 客户端上要删除的文件,3) 客户端要下载的新文件。列表 1) 和 3) 可以在某些实现中合并,但有时了解哪些文件是新文件很有用。
客户端开始处理这些命令,下载 new/changed 文件并删除所有应该删除的文件。
客户端完成下载后,它可以创建自己的进程已完成通知。
这个过程有几个关键方面。首先,某种识别版本信息很重要。此处最简单的方案是服务器跟踪每个文件的单调递增版本号,以便每次在服务器上更改文件时,版本号都会增加。文件传给客户端时,客户端也知道版本号,版本号不能丢失。如果不方便存储单独的版本号,可以使用文件修改date/time,但客户端在更新自己的文件时必须非常小心来设置修改date/time准确地匹配服务器的 date/time 而不是只接受最后在客户端本地写入的 date/time 因为那不是最后的服务器修改时间。
版本号也可以作为可识别的后缀存储在文件名中,例如 core-scripts-v11。在这种情况下,对外的实际文件名将是 core-scripts,但它会作为 core-scripts-v11 存储在存储库中,以表明它是版本 11。如果此文件更改为新版本,则新版本将成为 core-scripts-v12。将此与客户端文件列表进行任何比较都需要分别比较核心名称和版本,而不仅仅是原始文件名。
如果你想要一个原子同步操作,其中始终传输一组一致的文件并且你永远无法获得新一批文件的一部分和旧一批文件的一部分,那么必须做更多的工作完毕。当文件在服务器上更新时,它们必须以原子方式更新,以便客户端在与先前版本同步的过程中不会被中断。这很可能是通过维护多个版本的服务器存储库来完成的,以便与存储库的现有版本同步的客户端可以继续并完成与存储库的同步,并且更新文件的安装不会中断它。同样,有许多可能的方法可以解决这个特定问题。
node.js 客户端应用程序需要将文件夹与远程 node.js 服务器同步。 windows 上都是 运行。 同步只需要是单向的,从服务器到客户端,并且知道何时完成的某种方式会很好。带宽不是关键考虑因素,如果有部分更改,可以重新下载整个文件。就频率而言,例如 15 分钟的批量更新尝试就可以了。
传递文件夹内容的 xml 表示并下载每个更改的文件,最好说什么方法或库?
谢谢
您正在寻找 dropbox 的克隆,它将监视文件的更改等,所以我建议:
我能想到的编写您自己的单个文件目录的单向同步的最简单方法如下:
客户端收集当前拥有的文件列表和每个文件的一些识别版本信息(版本号、CRC、原始文件创建时间-日期)。
客户端在 ajax 请求中将该列表发送到服务器。
服务器接收客户端文件列表并将其与自己的文件列表进行比较。然后它 returns 返回客户端三个文件列表:1) 通过下载最新版本更新的文件,2) 客户端上要删除的文件,3) 客户端要下载的新文件。列表 1) 和 3) 可以在某些实现中合并,但有时了解哪些文件是新文件很有用。
客户端开始处理这些命令,下载 new/changed 文件并删除所有应该删除的文件。
客户端完成下载后,它可以创建自己的进程已完成通知。
这个过程有几个关键方面。首先,某种识别版本信息很重要。此处最简单的方案是服务器跟踪每个文件的单调递增版本号,以便每次在服务器上更改文件时,版本号都会增加。文件传给客户端时,客户端也知道版本号,版本号不能丢失。如果不方便存储单独的版本号,可以使用文件修改date/time,但客户端在更新自己的文件时必须非常小心来设置修改date/time准确地匹配服务器的 date/time 而不是只接受最后在客户端本地写入的 date/time 因为那不是最后的服务器修改时间。
版本号也可以作为可识别的后缀存储在文件名中,例如 core-scripts-v11。在这种情况下,对外的实际文件名将是 core-scripts,但它会作为 core-scripts-v11 存储在存储库中,以表明它是版本 11。如果此文件更改为新版本,则新版本将成为 core-scripts-v12。将此与客户端文件列表进行任何比较都需要分别比较核心名称和版本,而不仅仅是原始文件名。
如果你想要一个原子同步操作,其中始终传输一组一致的文件并且你永远无法获得新一批文件的一部分和旧一批文件的一部分,那么必须做更多的工作完毕。当文件在服务器上更新时,它们必须以原子方式更新,以便客户端在与先前版本同步的过程中不会被中断。这很可能是通过维护多个版本的服务器存储库来完成的,以便与存储库的现有版本同步的客户端可以继续并完成与存储库的同步,并且更新文件的安装不会中断它。同样,有许多可能的方法可以解决这个特定问题。