روبي اظهار تقدم عند نسخ الملفات
سؤال
وأود أن يكون قادرا على إظهار تقدم عملية نسخ الملفات عند نسخ الملفات باستخدام روبي (حاليا باستخدام FileUtils.cp) حاولت تحديد الخيار verbose
إلى true
لكن يبدو أن مجرد أن تدلني على نسخة القيادة الصادرة.
وأنا على التوالي هذا البرنامج النصي من سطر الأوامر في الوقت الراهن لذلك من الناحية المثالية أود أن تكون قادرة على تقديم شيء من هذا القبيل SCP يفعل الملفات عند نسخ، ولكن أنا لا فوسيد جدا عن العرض طالما يمكنني رؤية التقدم.
المحلول
وكما قلت لم يكن لديك ما يكفي من مندوب لتحرير أجوبة حتى الآن هنا هو نسختي على أساس الإجابة pisswillis، وجدت <لأ href = "http://0xcc.net/ruby-progressbar/index.html.en" يختلط = "نوفولو noreferrer" عنوان = "شريط التقدم جوهرة"> شريط التقدم جوهرة حيث أنا باستخدام أيضا في بلدي على سبيل المثال. لقد جربت هذا وعملت موافق حتى الآن، ولكن يمكن أن تفعله مع بعض تنظيف:
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
نصائح أخرى
ولفة بنفسك باستخدام 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 () هي طريقة لزيادة شريط التقدم التي كتبها شار واحد. ما سبق هو لم تختبر وربما جعل الأصوليون روبي سوء. ولا سيما فوضى EOFException القوة حتى الحلقة. أيضا سوف تحتاج بعض طريق التأكد من أن كافة وحدات البايت مكتوبة إذا no_of_bytes ليس صحيحا.
وأو هل يمكن أن مجرد الإختراق لاستخدام اللجنة الدائمة، إذا كان هذا هو شريط التقدم تريد:
def copy(source, dest)
`scp #{source} localhost:#{dest}`
end
وسيكون لديك للتأكد من نجا أسماء المصدر ودست بشكل صحيح لاستدعاء نظام. العلامة localhost:
يجعل اللجنة الدائمة نسخ الملفات كما هو الحال بين أجهزة الكمبيوتر، لذلك سوف تظهر شريط التقدم.
وتحت Windows لا تنس أن تضيف "ب" للالملفات الثنائية، لذلك "ث" و "ص" يجب أن يكون "البنك الدولي" و "م ع" عن الملفات الثنائية.
in_file = File.new(in_name, "rb")
out_file = File.new(out_name, "wb")