1

我希望我的应用程序能够显示来自远程 FTP(或 SFTP 等)位置的目录列表。当远程目录树中的文件/目录发生更改时,应用程序应使用相关更改更新其视图。

因为遍历整个树既慢又浪费,我想使用类似于 FSEvents 的东西(Linux 上的 inotify/kqueues),但显然这些库是基于文件系统的,与 FTP 服务器的连接是不一样的作为挂载的文件系统。

为了使这些库工作,我需要在本地机器上实际挂载一个由 FTP/SFTP 支持的文件系统,然后将 FSEventStream(或 kqueue 等)附加到这个本地挂载。我知道 FUSE 可以做到这一点,但有什么方法可以让我使用 FUSE 而无需用户先安装它?我的意思是,我可以将它与我的 (Mac) 应用程序捆绑并创建挂载,而无需让用户完成实际运行安装程序包以将 libfuse 和内核模块复制到系统中的过程吗?它是否假设/dev/fuse存在,或者它可以存在于/dev/路径之外,在我的应用程序目录中?

Nice Mac 应用程序通过简单的拖放安装,如果可能的话,我想保持这种方式。我不清楚是否可以直接使用 libfuse(只要文件包含在应用程序中),而无需将其安装在系统路径中。

或者,是否有人对通过 FTP 监控更改而不进行轮询有任何其他建议?

4

1 回答 1

2

不幸的是, FTPSFTP不支持任何形式的客户端通知。

与 HTTP 非常相似,它们基于请求/响应方案,其中每个数据传输都由客户端发起。更糟糕的是,与 HTTP 相反,没有办法要求服务器通知客户端自特定日期以来的任何更改。

这意味着不仅您必须使用轮询,而且所述轮询绝不是轻量级的。

就 FUSE 而言,大多数可用的 FTP 和 SFTP 模块仅在用户空间应用程序请求目录列表时(例如在文件浏览器窗口中点击刷新)更新其文件系统视图。他们不自行执行轮询。您的用户空间应用程序必须通过轮询目录本身来启动刷新。

编辑:

为了澄清一些事情,FUSE 的最新版本确实支持通知事件。它们只是将事件从模块传递到内核。模块仍然必须生成它们,并且在 FTP/SFTP 客户端模块的情况下,如果不轮询服务器是不可能的。

还要记住,尽管 NFSv4.1 有必要的规定,但许多当前的 NFS 实现也不支持更改通知。许多 SMB/CIFS 服务器(尤其是廉价网络附加存储嵌入式系统中的服务器)也仅限于不支持。

于 2010-12-08T12:13:45.443 回答