`

扩展Ironruby

阅读更多
在公司里,选择ruby作为类似perl、python的脚本语言来运用,主要是想建立一些DSL.但是在工作中,遇到了一系列的问题,最终我的选择是抛弃了cruby,果断投入ironruby的怀抱。下面的故事会说明我在CRuby上是多么被折腾

项目的有部分代码需要处理一些tgz的文件(就是.tar.gz),gz的话,zlib可以处理,所以主要任务是tar, 在rubyforge上搜索的结果,大概有6-7个结果,由于不知道这些gem的代码质量如何(真不能让人放心),于是全部装上一个个跑跑看。

第一个是minitar
  require 'zlib'
  require 'rubygems'
  require 'archive/tar/minitar'
  include Archive::Tar
  Minitar.unpack('c:/workspace/sun15002.tar', 'c:/x')


直接报错,原因是tar包里的目录被当成文件处理了,生成了一个空文件导致同名的目录无法建立。

第二个叫tarruby
require 'rubygems'
require 'tarruby'
    
Tar.gzopen('c:/workspace/sun16012.tgz', File::RDONLY, 0644, Tar::GNU | Tar::VERBOSE) do |tar|
      while tar.read # or 'tar.each do ...'
        puts tar.pathname
        tar.print_long_ls        
        if tar.reg? # regular file
          tar.extract_file(tar.pathname)          
          ##if extract buffer
          #puts tar.extract_buffer
        end
      end
   end


看上去挺美,但为什么只能解压到当前目录下。。。??

从tarruby的readme看到,作者提供了个libarchive,ok,我们follow.
  require 'rubygems'
 require 'libarchive_ruby'
 Archive.read_open_filename('C:/workspace/sun15002.tar') do |ar|
    while entry = ar.next_header
      name = entry.pathname
      ar.extract(entry)
      #data = ar.read_data
      #puts "#{name} (size=#{data.size})"
    end
  end


看上去也挺美,问题也依旧,虽然给个机会处理data....

接下来是archive-tar,号称是个0.9的版本
require 'rubygems'
require 'archive/tar'
include Archive::Tar
Archive::Tar.extract('c:/workspace/sun15002.tar','D:/tar')

但是连路径都处理不好,直接报错。

一起覆没的还有这个:http://www.aagh.net/files/ruby-tar/ruby-tar-0.1.0.tar.gz。

测试到这时候,几乎要让人抓狂了,再继续测试下去,不知道还有多少bug. gems的质量之差劲,让人发指。成熟点的rubyzip目前还无法处理tar。

还好,这时候有ironruby(选ironruby原因主要是后续还有一些WIM文件要处理)而且有成熟的SharpZipLib,事情就变得简单了。写了个短小的程序
using System;
using System.IO;
using ICSharpCode.SharpZipLib.GZip;
using ICSharpCode.SharpZipLib.Tar;
namespace TgzExtractor
{
    public class MiniTgz
    {
        public static bool Decompress_TGZ(string filename, string target)
        {

            //decompress tgz file

            byte[] dataBuffer = new byte[4096];

            Stream inStream = null;
            ICSharpCode.SharpZipLib.Tar.TarArchive tarArchiv = null;
            try
            {
                inStream = File.OpenRead(filename);
                inStream = new GZipInputStream(inStream);
                tarArchiv = ICSharpCode.SharpZipLib.Tar.TarArchive.CreateInputTarArchive(inStream);
                tarArchiv.ExtractContents(target);
            }

            catch (Exception ex)
            {
                string.Format("Could not decompress archive {0} " + ex.ToString(), filename);
                return false;
            }
            finally
            {
                    if (inStream != null)
                        inStream.Close();

                    if (tarArchiv != null)
                        tarArchiv.Close();
            }
           return true;
        }
    }
}


编译之后,将所有dll拷贝到%ruby_home%\lib\site_ruby\1.8下,启动iirb测试一下

require 'TgzExtractor'
include TgzExtractor
MiniTgz.Decompress_TGZ("C:/workspace/sun16012.tgz","C:/tar")


一切顺利。。这只是开始,下一回合,我想让ironruby可以很简单的利用7z.dll,这样可以处理的格式就更多了!

PS: ironruby的LOAD_PATH可以通过ir.exe.config设置
<set language="Ruby" option="LibraryPaths" value="..\..\Languages\Ruby\libs;c:\ruby\lib\ruby\site_ruby\1.8;c:\ruby\lib\ruby\site_ruby;c:\ruby\lib\ruby\1.8"></set>  
分享到:
评论
2 楼 ray_linn 2010-03-29  
jimxl 写道
幹麼非要用ruby的庫呢。直接調用命令解不行麼?


这是有不为外人道的原因....
1 楼 jimxl 2010-03-29  
幹麼非要用ruby的庫呢。直接調用命令解不行麼?

相关推荐

    IronRuby博客中文版_多用户博客空间源码下载.rar

    IronRuby博客中文版_多用户博客空间源码下载

    IronRuby开发包(Pre Alpha1)

    IronRuby 是 Ruby 编程语言在微软 .NET 平台上的一种实现。 IronRuby 与 Wilco Bauwer 的 IronRuby project 同名,2007年4月30日由微软于 MIX 上发表。并计划于2007年的 OSCON 公开推出。 2007年8月31日,John Lam...

    [博客空间]IronRuby博客中文版 Alpha_ironruby-pre-alpha1(ASP.NET源码).rar

    [博客空间]IronRuby博客中文版 Alpha_ironruby-pre-alpha1(ASP.NET源码).rar

    Sams.IronRuby.Unleashed.Feb.2010.pdf

    Sams.IronRuby.Unleashed.Feb.2010.pdf

    Sams.IronRuby.Unleashed.Feb.2010.rar

    Sams.IronRuby.Unleashed.Feb.2010.rar

    ASP.NET源码——[博客空间]IronRuby博客中文版 Alpha.zip

    ASP.NET源码——[博客空间]IronRuby博客中文版 Alpha.zip

    [博客空间]IronRuby博客中文版 Alpha_ironruby-pre-alpha1.zip源码ASP.NET网站源码打包

    [博客空间]IronRuby博客中文版 Alpha_ironruby-pre-alpha1.zip源码ASP.NET网站源码打包[博客空间]IronRuby博客中文版 Alpha_ironruby-pre-alpha1.zip源码ASP.NET网站源码打包[博客空间]IronRuby博客中文版 Alpha_...

    程序源码 IronRuby博客中文版 Alpha_ironruby-pre-alpha1(ASP.NET源码).rar

    免责声明:资料部分来源于合法的互联网渠道收集和整理,部分自己学习积累成果,供大家学习参考与交流。收取的费用仅用于收集和整理资料耗费时间的酬劳。 本人尊重原创作者或出版方,资料版权归原作者或出版方所有,...

    [IronRuby] C# 4.0调用ActiveRecord

    NULL 博文链接:https://raylinn.iteye.com/blog/670006

    ironruby-pre-alpha1.zip_pre

    Ruby语言在.net平台的实现。alpha版源代码,最初阶段代码,可能比较粗糙,但是对于初学者确实比较容易入门。

    一步一步学Silverlight 2系列

    Silverlight 2 Beta 1版本发布了,无论从Runtime还是Tools都给我们带来了很多的惊喜,如支持框架语言Visual Basic, Visual C#, IronRuby, Ironpython,对JSON、Web Service、WCF以及Sockets的支持等一系列新的特性。...

    ruby-1.8.7-p302.tar.gz

    Ruby,一种为简单快捷的面向对象编程(面向对象程序设计)而创的脚本语言,在20世纪90...由 Ruby 语言本身还发展出了JRuby(Java 平台)、IronRuby(.NET 平台)等其他平台的 Ruby 语言替代品。该版本为ruby-1.8.7-p302

    Ruby中文文档.zip

    Ruby,一种简单快捷的...由 Ruby 语言本身还发展出了JRuby(Java平台)、IronRuby(.NET平台)等其他平台的 Ruby 语言替代品。Ruby的作者于1993年2月24日开始编写Ruby,直至1995年12月才正式公开发布于fj(新闻组)。

    Ruby入门到精通

    Ruby入门到精通,Ruby,一种...由 Ruby 语言本身还发展出了JRuby(Java平台)、IronRuby(.NET平台)等其他平台的 Ruby 语言替代品。Ruby的作者于1993年2月24日开始编写Ruby,直至1995年12月才正式公开发布于fj(新闻组)。

    ruby安装包,window安装包

    由 Ruby 语言本身还发展出了JRuby(Java平台)、IronRuby(.NET平台)等其他平台的 Ruby 语言替代品。Ruby的作者于1993年2月24日开始编写Ruby,直至1995年12月才正式公开发布于fj(新闻组)。因为Perl发音与6月诞生...

    ruby-2.6.6.1.rar

    由 Ruby 语言本身还发展出了JRuby(Java平台)、IronRuby(.NET平台)等其他平台的 Ruby 语言替代品。Ruby的作者于1993年2月24日开始编写Ruby,直至1995年12月才正式公开发布于fj(新闻组)。因为Perl发音与6月诞生...

    ruby最新版稳定版

    由 Ruby 语言本身还发展出了JRuby(Java平台)、IronRuby(.NET平台)等其他平台的 Ruby 语言替代品。Ruby的作者于1993年2月24日开始编写Ruby,直至1995年12月才正式公开发布于fj(新闻组)。因为Perl发音与6月诞生...

    ruby-1.9.3-p0-doc-chm

    由 Ruby 语言本身还发展出了JRuby(Java 平台)、IronRuby(.NET 平台)等其他平台的 Ruby 语言替代品。Ruby的作者于1993年2月24日开始编写Ruby,直至1995年12月才正式公开发布于fj(新闻组)。因为Perl发音与6月...

    ruby 2.4.4 X64

    由 Ruby 语言本身还发展出了JRuby(Java平台)、IronRuby(.NET平台)等其他平台的 Ruby 语言替代品。Ruby的作者于1993年2月24日开始编写Ruby,直至1995年12月才正式公开发布于fj(新闻组)。因为Perl发音与6月诞生...

Global site tag (gtag.js) - Google Analytics