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.. :)

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir