রুবিতে স্ট্রিং হিসাবে বাইনারি ফাইল পড়ুন


263

আমার একটি টার ফাইল নেওয়ার এবং এটিকে স্ট্রিং (এবং বিপরীতে) রূপান্তর করার জন্য একটি সহজ উপায় প্রয়োজন। রুবিতে এটি করার কোনও উপায় আছে? আমার সেরা চেষ্টা এটি ছিল:

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ফাইলগুলি বিভিন্ন আকারের দেখায়, যদিও সেগুলি বেশ কাছাকাছি (এবং ফাইলটি খোলার ফলে বেশিরভাগ সামগ্রী অক্ষত থাকে)। আমি কী একটি ছোট ভুল করছি বা এটি সম্পাদন করার জন্য সম্পূর্ণ আলাদা (তবে কার্যক্ষম) উপায় আছে?


3
এটি একটি জিজিপড টার ফাইল (আমি আশা করি)। কোনও "লাইন" নেই। আপনি কী অর্জন করতে চাইছেন তা অনুগ্রহ করে প্লিজ।
ব্রেন্ট.লংবোরো

আপনি কি সংকুচিত ডেটা বা সঙ্কোচিত বিষয়বস্তুটি দেখার চেষ্টা করছেন?
ডেভিড নেহমে

সুতরাং একটি সংকুচিত ডেটা স্ট্রিমের
অক্ষরগুলির

এই প্রশ্নের পুনরায় শিরোনাম হওয়া উচিত " বাইনারি ফাইলটিকে স্ট্রিংয়ে রূপান্তর করুন ", IO.readঅন্যথায় পছন্দসই উত্তর হতে হবে।
ইয়ান

উত্তর:


397

প্রথমত, আপনার ফাইলটি বাইনারি ফাইল হিসাবে খোলা উচিত। তারপরে আপনি একটি কমান্ডে পুরো ফাইলটি পড়তে পারেন।

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

এটি আপনাকে একটি স্ট্রিংয়ে পুরো ফাইলটি পাবেন।

এর পরে, আপনি সম্ভবত করতে চান file.close। যদি আপনি এটি না করেন, fileআবর্জনা-সংগ্রহ না করা অবধি বন্ধ করা হবে না, তাই এটি উন্মুক্ত থাকাকালীন এটি সিস্টেম সংস্থানগুলির সামান্য বর্জ্য হবে।


22
বাইনারি পতাকাটি কেবল উইন্ডোজে প্রাসঙ্গিক, এবং এটি ফাইল বিবরণকারী খোলা ছেড়ে দেয়। ফাইল.রেড (...) আরও ভাল।
ড্যানিয়েল হাকস্টেপ

এটিকে দেখার জন্য এবং এটিকে ওয়ান-লাইনার সমাধান (স্ট্যাকওভারফ্লোতে প্রচুর পরিমাণের মতো) হিসাবে আটকানোতে অনুলিপি করে কোনও সমস্যা আছে কি? সর্বোপরি, এটি কাজ করে এবং এই ফাংশনগুলির নামটি ছিল রুবি গ্রন্থাগার ডিজাইনারদের মধ্যে কেবল একটি স্বেচ্ছাসেবী পছন্দ। যদি কেবল আমাদের প্রতিশব্দ সহ কিছু ভাষা থাকে ... যা এখনও কোনওরকমভাবে জানে যে প্রান্তের ক্ষেত্রে / অস্পষ্ট উদাহরণগুলিতে আমরা কী চাই। তাহলে আমি ঠিক করব contents = (contents of file "path to file.txt" as string)
মাস্টারেক্সিলো

2
এটি begin {..open..} ensure {..close..} endব্লকগুলিতে করা উচিত
শেডবিক

3
@ আরিয়ানফুর্তোষ না, ফাইলটি পড়ার এটি অন্য পদ্ধতি - এর অর্থ এই নয় যে এটিকে নিরীক্ষণযোগ্য এবং চালানো হিসাবে বিবেচনা করা হবে! এটি একটি সহজ 'পড়ুন' পদ্ধতির জন্য ভয়াবহ পার্শ্ব-প্রতিক্রিয়া হবে।
ম্যাথু

1
@ ডেভিড আপনি কি নিম্নলিখিত ওয়ানলাইনারটি সহজভাবে করতে পারবেন না? contents = File.binread('path-to-file.tar.gz')দেখুন apidockFileএর একটি সাবক্লাস IO
ভাস

244

আপনার যদি বাইনারি মোডের প্রয়োজন হয় তবে আপনাকে এটি হার্ড পদ্ধতিতে করতে হবে:

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

যদি তা না হয় তবে ছোট এবং মিষ্টি হ'ল:

s = IO.read(filename)

রুবি ১.৯.৩++ এ, আইওড্রেড আপনাকে এনকোডিং.ডেফাল্ট_এক্সটার্নে এনকোডিং সহ চিহ্নিত একটি স্ট্রিং দেবে। আমার মনে হয় (?) বাইটগুলি সমস্ত ফাইলের মতোই থাকবে, সুতরাং এটি ঠিক "বাইনারি-নিরাপদ নয়" নয়, আপনি যদি চান তবে আপনাকে এটি বাইনারি এনকোডিং দিয়ে ট্যাগ করতে হবে।
jrochPoint

যদি সংক্ষিপ্ততা এবং s = File.open(filename, 'rb', &:read)
মিষ্টিত্বের মূল কথাটি থাকে

114

ফাইলটি উন্মুক্ত না এড়াতে, ফাইল.ওপেনে একটি ব্লক পাস করা ভাল। এইভাবে, ব্লকটি কার্যকর হওয়ার পরে ফাইলটি বন্ধ হয়ে যাবে।

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

10
এটি ডেভিড নেহমের চেয়ে উত্তম উত্তর কারণ ফাইল বর্ণনাকারীরা একটি সীমাবদ্ধ সিস্টেমের উত্স এবং এগুলি ক্লান্ত করা একটি সাধারণ সমস্যা যা সহজেই এড়ানো যায়।
জেফ ম্যাকচুন

17

ওএস এক্স এ কি আমার জন্য একই ... এটি কি উইন্ডোতে অতিরিক্ত "\ r" হতে পারে?

যে কোনও ক্ষেত্রে আপনার সাথে আরও ভাল হতে পারে:

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

এটি সবচেয়ে সহজ সমাধান বলে মনে হচ্ছে।
ডিস্কানড্যান্টি

17

কিছু খোলা / নিকট সুরক্ষা সম্পর্কে কীভাবে।

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

কেন একটি স্পষ্ট .ক্লোজ না? যেমন ওপি ফাইলের মধ্যে। কুকর্ম শেষ হলে?
জোশুয়া

2
ফাইল.ওপেন () {| ফাইল | ব্লক the ব্লকটি বন্ধ হয়ে গেলে স্বয়ংক্রিয়ভাবে বন্ধ হয়। রুবি
অ্যালেক্স

14
এটি ২০০৮ সালে পোস্ট করা অ্যারোন হিন্নির জবাবের অনুরূপ ( ওপির ফাইল এবং ভেরিয়েবল নাম ব্যবহার না করে) ...
আবে ভোলেকার

10

রুবির বাইনারি রিডিং রয়েছে

data = IO.binread(path/filaname)

বা রুবির কম হলে 1.9.2

data = IO.read(path/file)

7

আপনি সম্ভবত বেস 64 এ টার ফাইলটি এনকোড করতে পারেন। বেস 64 আপনাকে একটি সরল পাঠ্য ফাইলে সংরক্ষণ করতে পারে এমন ফাইলটির খাঁটি ASCII উপস্থাপনা দেবে। তারপরে আপনি টেক্সটটি পিছনে ডিকোড করে ডায়ার ফাইলটি পুনরুদ্ধার করতে পারবেন।

আপনি যেমন কিছু করেন:

require 'base64'

file_contents = Base64.encode64(tar_file_data)

আরও ভাল ধারণা পেতে বেস 64 রুবডোকগুলি দেখুন ।


দুর্দান্ত, দেখে মনে হচ্ছে এটি খুব কার্যকর হবে! কোনও কারণে বাইনারি বিষয়বস্তু পড়ার কারণে যদি এটি সর্বাপেক্ষা উত্তপ্ত হয় তবে আমাকে এটি পরীক্ষা করে দেখতে হবে।
ক্রিস বাঞ্চ

0

আপনি যদি বেস 64 দ্বারা ট্যারি ফাইলটি এনকোড করতে পারেন (এবং এটি একটি সরল পাঠ্য ফাইলে সংরক্ষণ করে) আপনি ব্যবহার করতে পারেন

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

অথবা

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

প্রতিটি (পাঠ্য) লাইনটি সেমিডিতে প্রিন্ট করতে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.