2016-01-21 59 views
1

我很难在Ruby中使用GPGME加密大文件(大于可用内存)。Ruby GPGME - 如何加密大文件

#!/usr/bin/ruby 
require 'gpgme' 

def gpgfile(localfile) 
    crypto = GPGME::Crypto.new 
    filebasename = File.basename(localfile) 
    filecripted = crypto.encrypt File.read(localfile), :recipients => "[email protected]", :always_trust => true 
    File.open("#{localfile}.gpg", 'w') { |file| file.write(filecripted) } 
end 

gpgpfile("/home/largefile.data") 

在这种情况下,我得到了内存分配错误: “读:无法分配内存(NoMemoryError)”

有人可以解释我如何读取数据块的源文件块(例如100Mb),并写他们通过加密传递?

回答

0

最明显的问题是你正在用File.read(localfile)将整个文件读入内存。 Crypto#encrypt方法将把一个IO对象作为它的输入,所以你可以将它传递给一个File对象,而不是File.read(localfile)(它将文件内容作为字符串返回)。同样,你可以给一个IO对象作为:output选项,让你直接写输出到文件,而不是在内存:

def gpgfile(localfile) 
    infile = File.open(localfile, 'r') 
    outfile = File.open("#{localfile}.gpg", 'w') 

    crypto = GPGME::Crypto.new  
    crypto.encrypt(infile, recipients: "[email protected]", 
         output: outfile, 
         always_trust: true) 
ensure 
    infile.close 
    outfile.close 
end 

我从来没有使用红宝石GPGME,所以我不是100%肯定这会解决你的问题,因为它取决于ruby-gpgme在幕后做了些什么,但是从我看过的文档和源代码看起来像是一个理性建造的宝石,所以我猜这会做招。

+0

我只是使用gpgme,这是我如何做,所以它应该工作(虽然我使用的是File.open的块形式) –

+0

亲爱的downvoter:请留下评论,解释你downvote的原因。如果我的答案缺乏,我希望有机会改进它。 –

+0

刚刚测试过我的目的,它的功能就像一个魅力,非常感谢! –