那些KDE中的技术(三)KIO

csslayer | 2011/02/24

KIO是KDE当中用于处理各种协议的一个模块。可以用于访问各种协议,例如http,ftp等等各种协议。对于开发者来说,这是一个很方便的技术,可以使得开发者不用关注于协议和文件处理。

Gnome也有类似的技术,gio,和kio不同的是,它是基于gvfs的。和KIO相比,似乎gio的性能要更好一些。这也是由于设计上的一些原因导致的。

gvfs采用FUSE,因此支持的协议都是能够很好映射到文件系统上的协议,例如ftp,smb,所有的内容都会被挂载到.gvfs下面。KIO则是为每个协议提供一个slave进程,通过IPC来访问,一方面提供了更好的扩展性,例如支持各种无法映射到POSIX的协议,但是另一方面也带来了一些性能问题。

不过在相反的一方面,也能实现一些自定义的文件访问。例如对于cd的访问就是很有意思的一个kio。

如果各位有cd的话,用dolphin打开cd,就会发现cd当中的音轨变成了各种格式的文件,例如mp3,ogg,wav等等。(以前用过,不过现在手头没有cd,就不做展示了),直接利用dolphin就可以进行转码的的操作。又比如,kde可以直接浏览svn的版本库(需要安装kdesvn)。

于是我顺便察看了一下我文件系统里面的kio模块,偶然还发现几个很有意思的东西。man/info(这个其实是被khelpcenter使用的),用于浏览系统的man,settings,和systemsettings一样的分类浏览。applications,浏览系统安装的程序。imap/pop3,可以用dolphin直接浏览imap/pop3协议的邮件。具体系统当中支持的kio可以通过khelpcenter察看。

浏览应用程序

没想过有一天dolphin也可以当邮件客户端吧……

KIO的存在其实极大丰富了KDE程序的网络协议上和文件访问的功能,不过和采用FUSE的gvfs相比较而言,我更喜欢gvfs,它提供的是和POSIX文件一样的接口,现在其他不支持kio的程序如果想访问kio的文件的话,基本就是采用在tmp下面创建对应的临时文件再访问的形式,和真正的文件系统相比,兼容和扩展性就差一些了。之前也关注过两个类似的项目,kio-giobridge,和kio-fuse,但是似乎都已经停止了开发。希望将来能够在支持POSIX的协议上采用类似VFS的方式提高一些性能。对于开发者而言,KIO则提供了极其强大的灵活性。例如imap的kio,开发一个支持imap的邮件客户端就可以将其转化为imap协议上的文件操作了。konqueror的书签也可以通过kio管理,这样也可以很容易的实现一个统一的书签管理界面(interface)。

一个小tip:

想必大家如果用linux的话,可能经常会使用sftp进行文件传输,如果用创建网络文件夹的向导的话,dolphin总是优先创建fish协议而不是sftp协议的链接,关于这两个协议的差别,请参考wikipedia(fishsftp)。用sftp似乎会得到更好的性能。

P.S.

特意找出以前周杰伦的CD show下audiocd的功能:

 

Tags:

7 FEEDBACKS

  1. pingz

    说下,我用fish传大文件时最后stall的情况很多,不知道为什么。基本上就是这个bug,http://bugs.kde.org/show_bug.cgi?id=147948 。

  2. 一个dolphin或者Konqueror+各种插件,说不定就是个操作系统了……

  3. abcd

    说到CD的kio,转录mp3就从来没有成功过…

  4. @abcd 我今天试了试,还算能用吧。补了个图。

  5. abcd

    @csslayer 吓,难道一直是我自己的错…再钻研下…

  6. @pingz 啊,抱歉……你的评论被当成了spam…… = =b,原因不知。fish似乎已经快处于deprecated的状态了。我写这篇文的时候才发现fish和sftp其实不是一个协议,我一直以为是别名呢。这两天用sftp传输之后才发现,sftp确实比fish好得多,算是不错了。

  7. @pingz @csslayer fish 和 sftp 协议最主要的区别算是, sftp 依赖于 sftpd 服务,要求远程机器没禁用 sftp-server; 而 fish 是通过 ssh 调用远程机器的 ls 列目录用 cat/dd 发文件,在远程机器禁用 sftp 时依旧可以搞文件。

Leave a Reply

Your email address will not be published. Required fields are marked *

Note: Commenter is allowed to use '@User+blank' to automatically notify your reply to other commenter. e.g, if ABC is one of commenter of this post, then write '@ABC '(exclude ') will automatically send your comment to ABC. Using '@all ' to notify all previous commenters. Be sure that the value of User should exactly match with commenter's name (case sensitive).