扩展Ironruby

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

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

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

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

第二个叫tarruby
[code]
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
[/code]

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

从tarruby的readme看到,作者提供了个libarchive,ok,我们follow.
[code]
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
[/code]

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

接下来是archive-tar,号称是个0.9的版本
[code]
require 'rubygems'
require 'archive/tar'
include Archive::Tar
Archive::Tar.extract('c:/workspace/sun15002.tar','D:/tar')
[/code]
但是连路径都处理不好,直接报错。

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

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

还好,这时候有ironruby(选ironruby原因主要是后续还有一些WIM文件要处理)而且有成熟的SharpZipLib,事情就变得简单了。写了个短小的程序
[code]
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;
}
}
}
[/code]

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

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

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

PS: ironruby的LOAD_PATH可以通过ir.exe.config设置
[code]
<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>
[/code]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值