سؤال

وأود أن يكون قادرا على إظهار تقدم عملية نسخ الملفات عند نسخ الملفات باستخدام روبي (حاليا باستخدام 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")
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top