Merhabalar arkadaşlar,
Bir Önceki yazımda Ruby ile gerçekleştirdiğim yedekleme sisteminden bahsetmiş ve tanımlarının nasıl yapılması gerektiğini anlatmıştım. Bu yazımda ise kod bloğunu sizlerle paylaşarak bazı ipuçları vermek istiyorum. BÖylece eğer isterseniz, uygulamayı kendinize gÖre değiştirmeniz daha kolay hale gelecektir.
Diğer tüm yazılarımda olduğu gibi hemen konumuza geçelim. Rackup.rb dosyasını parça parça işleyeceğiz.
$stdout.sync = true require 'yaml' begin require "zip/zip" rescue Exception => err puts "Error: You should execute 'gem install rubyzip --include-dependencies' command, before run this program.." puts err.message exit end
Bu bÖlümde, eğer ‘rubyzip’ kütüphanesi yok ise, oluşan hata program tarafından yakalanır ve kullanıcıya sorunu nasıl giderebileceği belirtilir.
begin config = YAML::load(IO.read(ARGV[0] || "rackup_config.yaml")) rescue Exception => err puts "Error: Configuration file can not be found.." puts err.message exit end
Bu bÖlümde ayar dosyası disk üzerinden okunmaya çalışılır.
IO.read(ARGV[0] || "rackup_config.yaml")
ARGV[0]: Gelen ilk parametre anlamındadır.
Eğer gelen bir parametre var ise onu, eğer gelen herhangi bir parametre yok ise “rackup_config.yaml”yi yani standart ayar dosyasını kullanmasını sÖyler.
source_folder = config["source"] source_include_sub_folders = (["true", "yes", "evet", "yeah", "y", "e", "1"].include?(config["include_subfolders"].to_s) ? true : false) source_file_extension = config["file_extension"] || "*" target_folder = config["target"] target_prefix = config["prefix"] target_postfix = config["postfix"]
bu bÖlümde ise ‘yaml’ içersinden yedekleme işlemi ile ilgili bilgiler okunur.
# Tüm evet anlamına gelen ifadeler kullanılmıştır.. (["true", "yes", "evet", "yeah", "y", "e", "1"].include?(config["include_subfolders"].to_s) ? true : false)
config[“include_subfolders”] bilgisine “true”, “yes”, “evet”, “yeah”, “y”, “e”, “1” bilgilerinden herhangi birinin yazılsının ‘true’ olacağını ifade eder.
source_files = nil
if source_file_extension.include?(",")
source_files = File.join("**", "*.{#{source_file_extension}}")
else
source_files = File.join("**", "*.#{source_file_extension}")
end
puts "Source dir is #{source_folder}"
puts "Target dir is #{target_folder}"
puts "File type is #{source_files.to_s}"
if File.directory?(source_folder) == false || File.directory?(target_folder) == false
puts "Error: Source or target folder can not be found..!"
exit
end
Bu bÖlümde ise birden fazla dosya uzantısı (file_extension) tanımlandı ise farklı bir takım işlemler yapar. Hedef ve kaynak dizin ile dosya uzantılarını ekrana yazar. Hedef ve kaynak dizinlerin varlığını kontrol eder.
Dir.chdir(source_folder)
zipFileName = target_folder + "\\" + target_prefix + Time.now.strftime("%Y%m%d-%H%M") + target_postfix + ".zip"
puts "#{zipFileName} is creating..."
begin
Zip::ZipOutputStream::open(zipFileName) do |zipfile|
Dir.glob(source_files) do |fileName|
fullFileName = source_folder + "\\" + fileName.gsub('/','\\')
next if FileTest.directory?(fullFileName)
File.open(fullFileName, "rb") do |file|
file.binmode
zipfile.put_next_entry(fileName, Zlib::BEST_SPEED)
zipfile.write(file.read)
end
end
end
rescue Exception => err
puts "Error : #{err.message}"
puts err.backtrace.join('\n')
begin
File.delete(zipFileName)
rescue
end
else
puts "operation completed."
end
Bu bÖlümde ise gerçek işlemin yapıldığı bÖlümdür :)
Kolay gelsin :)