Ruby Zip Kütüphanesi (RubyZip)

Merhabalar arkadaşlar,

Uzun ama çok uzun bir aradan sonra tekrar merhaba :). Evlilik hazırlıkları, nikah sonrası dinlenme derken nihayet bugün ilk blog yazımı yazma fırsatı buldum. Öncelikle nikah tÖrenimde beni yanlız bırakmayan tüm arkadaşlara teşekkürlerimi tekrar iletmek isterim. Gerçekten insan bu gibi günlerde etrafında arkadaşlarını gÖrmek istiyor. Şimdi ben bu şekilde yazı yazdım ya.. gelemeyenleri hemen bir telaş almış olabilir :) merak etmesinler, korkacak birşey yok hiç birini Öldürmeyeceğim… yani şimdilik :)

Lafı uzatmadan bu yazımızın konusu olan RubyZip’i (Ruby için sıkıştırma kütüphanesi) incelemeye başlayım. Kullanımı diğer tüm Ruby kütüphaneleri gibi oldukça kolay olan bu sıkıştırma kütüphanesinin kurulumuda oldukça basit….
gem install rubyzip –include-dependencies
şeklinde kurulumu gerçekleştirililyor.

Kullanımı daha da kolay sanki; (Uzun olduğuna bakmayın içerisinde sizin için çok faydalı yorumlar mevcut)

require "zip/zip"
# Kaynak dizin olarak 'Ruby Samples' belirlenir
sourceFolder = "D:\\Ruby Samples"
Dir.chdir(sourceFolder)
# Hedef dosya olarak Ruby Samples.zip belirlenir.
zipFileName = "C:\\Ruby Samples.zip"
begin
	# Zip dosyası yaratılır.
	Zip::ZipOutputStream::open(zipFileName) do |zipfile|
		# Kaynak('Ruby Samples') klasÖrü içerisinde yer alan 
		# tüm *.rb dosyaları üzerinde işlem yapar.
		Dir.glob("**/*.rb") do |fileName|
			# Üzerinde bulununan dosyanın tam ismi oluşturulur.
			fullFileName = sourceFolder + "\\" + fileName.gsub('/','\\')
			# Dir.glob işlemi içerisinde '.' bulunan klasÖrleri de dosya olarak gÖrür
			# bu Bug nedeni ile dosya olarak elimizde bulunan dosyanın klasÖr olup olmadığı
			# kontrol edilmelidir.
			next if FileTest.directory?(fullFileName)
			# Dosya okunur
			File.open(fullFileName, "rb") do |file|
				# Dosya üzerinde 'binary' işlem yapılacağı belirtilir.
				file.binmode
				# Zip dosyası içerisine Öncelikle kayıdı açılır. Bu işlem esnasında
				# daha Önceden açık bir kayıt var ise kapatılır ve yenisi açılır.
				zipfile.put_next_entry(fileName, Zlib::BEST_SPEED)
				# Daha sonra dosyanın verileri aktarılır.
				zipfile.write(file.read)
			end
		end
	end
rescue Exception => err
	# Herhangi bir hata oluştuğunda hata ekrana yazdırılır 
	# ve hedef zip dosyası silinir.
	puts "Error :  #{err.message}"
	puts err.backtrace.join('\n')
	begin 
		File.delete(zipFileName) 
	rescue 
	end
else
	puts "operation completed."
end

Özellikle Dir.glob işlemi ‘.’ bulunan klasÖrleri de dosya olarak gÖrmesi üzerinde durulması gereken bir konudur. Hatalı işlemlere neden olabilir.
Bununla beraber dosyanın ‘binmode‘ Özelliği ‘true‘ yapılmadan Önce yapılan herhangi bir okuma sonucunda, sadece metin içeren dosyalar için pek Önemli bir fark oluşmazken, diğer tüm dosya türleri için hatalı okuma anlamına gelir. Bu nedenle bu işlem yapıldıktan sonra dosya üzerinden okuma işlemi yapılmalıdır.

Bir sonraki yazımda Rackup (Ruby Backup, ismi kendim uydurdum açıkcası, umarım başkaları kullanmıyordur :) ) adlı kendim için yazdığım bir yedekleme yazılımından bahsedeceğim. Umarım sizlerde kullanır ve seversiniz. Ben ve arkadaşlarım güzel güzel kullanıyoruz açıkcası :)

Kolay gelsin.. :)

Share