那些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).

This site uses Akismet to reduce spam. Learn how your comment data is processed.