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