2009-03-19 11 views
8

मैं रूबी (वर्तमान में FileUtils.cp का उपयोग कर) की प्रतिलिपि बनाते समय फ़ाइल कॉपी ऑपरेशन की प्रगति दिखाने में सक्षम होना चाहता हूं। मैंने verbose विकल्प को true पर सेट करने का प्रयास किया है, लेकिन यह सिर्फ मुझे कॉपी कॉपी कमांड दिखाता है।फाइलों की प्रतिलिपि करते समय रूबी शो प्रगति

मैं इस स्क्रिप्ट को इस समय कमांड लाइन से चला रहा हूं, इसलिए आदर्श रूप से मैं एससीपी की तरह कुछ प्रस्तुत करने में सक्षम होना चाहता हूं जब यह फाइल कॉपी करता है, लेकिन जब तक मैं प्रस्तुति के बारे में बहुत परेशान नहीं हूं, प्रगति देख सकते हैं।

उत्तर

14

क्योंकि मेरे पास उत्तर संपादित करने के लिए पर्याप्त प्रतिनिधि नहीं है, फिर भी मेरा संस्करण पिसविल जवाब पर आधारित है, मुझे progress bar gem मिला जो मैं अपने उदाहरण में भी उपयोग कर रहा हूं। मैं इस परीक्षण किया है और यह ठीक अब तक काम किया है, लेकिन यह सफाई से कुछ के साथ कर सकता है:

require 'rubygems' 
require 'progressbar' 

in_name  = "src_file.txt" 
out_name = "dest_file.txt" 

in_file  = File.new(in_name, "r") 
out_file = File.new(out_name, "w") 

in_size  = File.size(in_name) 
# Edit: float division. 
batch_bytes = (in_size/100.0).ceil 
total  = 0 
p_bar  = ProgressBar.new('Copying', 100) 

buffer  = in_file.sysread(batch_bytes) 
while total < in_size do 
out_file.syswrite(buffer) 
p_bar.inc 
total += batch_bytes 
if (in_size - total) < batch_bytes 
    batch_bytes = (in_size - total) 
end 
buffer = in_file.sysread(batch_bytes) 
end 
p_bar.finish 
+2

अच्छी तरह से किया। और प्रगति पट्टी में मुझे पेश करने के लिए धन्यवाद। – pisswillis

+0

उस के लिए उपयोगी मणि +1 :) – JstRoRR

7

IO.syswrite, IO.sysread का उपयोग करके स्वयं को रोल करें।

सबसे पहले, (वर्ण में) प्रगति बार की लंबाई तय .. तो इस छद्म कोड यह करना चाहिए (परीक्षण नहीं):

infile = File.new("source", "r") 
outfile = File.new("target", "w") 

no_of_bytes = infile.length/PROGRESS_BAR_LENGTH 

buffer = infile.sysread(no_of_bytes) 
while buffer do 
outfile = syswrite(buffer) 
update_progress_bar() 
buffer = infile.sysread(no_of_bytes) 
end 

जहां update_progress_bar() एक के बाद प्रगति बार बढ़ाने के लिए अपने विधि है चार। उपरोक्त परीक्षण नहीं किया गया है और शायद रूबी purists बीमार बना देगा। विशेष रूप से एक EOFException लूप को गड़बड़ कर सकता है। इसके अलावा आपको यह सुनिश्चित करने के कुछ तरीके की आवश्यकता होगी कि सभी बाइट्स लिखे गए हैं यदि no_of_bytes पूर्णांक नहीं है।

+0

एक महान प्रारंभिक बिंदु, लेकिन जैसा कि मैं इसे संपादित नहीं कर सका, मुझे अपने कामकाजी कोड के साथ अपना जवाब जोड़ना पड़ा। – DEfusion

5

या आप बस इसे, SCP उपयोग करने के लिए है कि अगर प्रगति बार आप की तरह है हैक कर सकता है:

def copy(source, dest) 
    `scp #{source} localhost:#{dest}` 
end 

तुम्हें यकीन स्रोत और गंतव्य के नाम ठीक से एक सिस्टम कॉल के लिए भाग निकले कर रहे हैं बनाने के लिए करना होगा। localhost: टैग स्कैन को फ़ाइलों के बीच फ़ाइलों की प्रतिलिपि बनाता है, इसलिए यह एक प्रगति पट्टी दिखाएगा।

+0

क्या एक अच्छा विचार है, उस बारे में नहीं सोचा था। – DEfusion

0

विंडोज के अंतर्गत बाइनरी फ़ाइलों के लिए 'बी' को जोड़ने के लिए है, इसलिए 'डब्ल्यू' और 'भूल नहीं है आर 'बाइनरी फाइलों के लिए' wb 'और' आरबी 'होना चाहिए।

in_file  = File.new(in_name, "rb") 
out_file = File.new(out_name, "wb")