2016-01-21 94 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

剛剛測試過我的目的,它的功能就像一個魅力,非常感謝! –