浏览 2101 次
锁定老帖子 主题:扩展Ironruby
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2010-03-28
最后修改:2010-05-19
项目的有部分代码需要处理一些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> 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2010-03-29
幹麼非要用ruby的庫呢。直接調用命令解不行麼?
|
|
返回顶楼 | |
发表时间:2010-03-29
jimxl 写道 幹麼非要用ruby的庫呢。直接調用命令解不行麼?
这是有不为外人道的原因.... |
|
返回顶楼 | |