سؤال

أحتاج إلى طريقة سهلة لأخذ ملف tar وتحويله إلى سلسلة (والعكس صحيح).هل هناك طريقة للقيام بذلك في روبي؟أفضل محاولتي كانت هذه:

file = File.open("path-to-file.tar.gz")
contents = ""
file.each {|line|
  contents << line
}

اعتقدت أن ذلك سيكون كافيًا لتحويله إلى سلسلة، ولكن بعد ذلك عندما أحاول كتابته مرة أخرى مثل هذا ...

newFile = File.open("test.tar.gz", "w")
newFile.write(contents)

إنه ليس نفس الملفعمل ls -l يظهر أن الملفات بأحجام مختلفة، على الرغم من أنها قريبة جدًا (ويكشف فتح الملف عن معظم المحتويات سليمة).هل هناك خطأ صغير أرتكبه أو هناك طريقة مختلفة تمامًا (ولكنها عملية) لتحقيق ذلك؟

هل كانت مفيدة؟

المحلول

أولاً، يجب عليك فتح الملف كملف ثنائي.ثم يمكنك قراءة الملف بأكمله في أمر واحد.

file = File.open("path-to-file.tar.gz", "rb")
contents = file.read

سيؤدي ذلك إلى حصولك على الملف بأكمله في سلسلة.

بعد ذلك، ربما تريد ذلك file.close.إذا لم تفعل ذلك، file لن يتم إغلاقه حتى يتم تجميع البيانات المهملة، لذلك سيكون إهدارًا طفيفًا لموارد النظام عندما يكون مفتوحًا.

نصائح أخرى

إذا كنت بحاجة إلى الوضع الثنائي، فستحتاج إلى القيام بذلك بالطريقة الصعبة:

s = File.open(filename, 'rb') { |f| f.read }

إذا لم يكن الأمر كذلك، فالأقصر والأحلى هو:

s = IO.read(filename)

لتجنب ترك الملف مفتوحًا، من الأفضل تمرير كتلة إلى File.open.بهذه الطريقة، سيتم إغلاق الملف بعد تنفيذ الحظر.

contents = File.open('path-to-file.tar.gz', 'rb') { |f| f.read }

على نظام التشغيل x هذه هي نفسها بالنسبة لي ...هل يمكن أن يكون هذا " " إضافيًا في نظام التشغيل Windows؟

على أية حال قد تكون أفضل مع:

contents = File.read("e.tgz")
newFile = File.open("ee.tgz", "w")
newFile.write(contents)

ماذا عن بعض السلامة المفتوحة/المغلقة.

string = File.open('file.txt', 'rb') { |file| file.read }

روبي لديها قراءة ثنائية

data = IO.binread(path/filaname)

أو إذا كان أقل من روبي 1.9.2

data = IO.read(path/file)

ربما يمكنك تشفير ملف tar في Base64.سيمنحك Base 64 تمثيل ASCII خالصًا للملف الذي يمكنك تخزينه في ملف نصي عادي.ثم يمكنك استرداد ملف tar عن طريق فك تشفير النص مرة أخرى.

أنت تفعل شيئًا مثل:

require 'base64'

file_contents = Base64.encode64(tar_file_data)

ألق نظرة على Base64 روبيدوكس للحصول على فكرة أفضل.

إذا كان بإمكانك تشفير ملف tar بواسطة Base64 (وخزنه في ملف نصي عادي)، فيمكنك استخدامه

File.open("my_tar.txt").each {|line| puts line}

أو

File.new("name_file.txt", "r").each {|line| puts line}

لطباعة كل سطر (نص) في cmd.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top