我希望我的应用程序能够显示来自远程FTP (或SFTP等)位置的目录列表。当远程目录树中的文件/目录发生更改时,应用程序应使用相关更改更新其视图。
因为遍历整个树很慢而且很浪费,所以我想使用类似FSEvents的东西(Linux上的inotify/kqueue),但显然这些库是基于文件系统的,到FTP服务器的连接与挂载的文件系统不同。
为了使这些库正常工作,我需要在本地机器上实际挂载一个由FTP/SFTP支持的文件系统,然后将一个FSEventStream (或kqueue等)附加到这个本地挂载。我知道FUSE可以做到这一点,但是有没有什么方法可以不用用户先安装就可以使用FUSE呢?我的意思是,我可以将它与我的(Mac)应用程序捆绑在一起并创建挂载,而不必让用户经历实际运行安装程序包以将libfuse和内核模块复制到系统中的过程吗?它是否假设/dev/fuse存在,或者它是否存在于我的应用程序目录内的/dev/路径之外?
很好的Mac应用程序是通过简单的拖放来安装的,如果可能的话,我想保持这种方式。我不清楚是否可以直接使用libfuse (假设文件包含在应用程序中),而不是在系统路径中安装它。
或者,有没有人有任何其他的建议来监控FTP上的变化,而不是轮询?
发布于 2010-12-08 20:13:45
不幸的是,FTP和SFTP不支持任何形式的客户端通知。
与HTTP非常相似,它们基于请求/响应方案,其中每个数据传输都由客户端发起。更糟糕的是,与HTTP相反,没有办法要求服务器通知客户端自特定日期以来的任何更改。
这意味着你不仅要使用轮询,而且所说的轮询决不是轻量级的。
就FUSE而言,大多数可用的FTP和SFTP模块仅在用户空间应用程序要求目录列表(例如,在文件浏览器窗口中点击刷新)时才更新其文件系统视图。它们不会自己执行轮询。您的用户空间应用程序必须通过轮询目录本身来启动刷新。
编辑:
为了澄清一些事情,FUSE的最新版本确实支持通知事件。它们只是将事件从模块传递到内核。模块仍然必须生成它们,并且在FTP/SFTP客户端模块的情况下,如果不轮询服务器,这是不可能的。
还要记住,尽管NFSv4.1具有必要的规定,但许多当前的NFS实现也不支持更改通知。许多SMB/CIFS服务器(特别是那些廉价的网络附加存储嵌入式系统)也仅限于没有支持。
https://stackoverflow.com/questions/4321035
复制相似问题