Rafael_Sol_Maker

RAFAEL_SOL_MAKER's VX FILE CLASS ENTENSION v.1.0

Nov 17th, 2011
242
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 5.72 KB | None | 0 0
  1. #===============================================================================
  2. #             RAFAEL_SOL_MAKER's VX FILE CLASS ENTENSION v.1.0
  3. #        (Baseado no módulo 'ftools.rb', de um módulo padrão do Ruby)
  4. #-------------------------------------------------------------------------------
  5. # Descrição:    Extensão para o módulo File, para aumentar o número de funções e
  6. #               consequentemente melhorar a tarefa da manipulação de arquivos.
  7. #-------------------------------------------------------------------------------
  8. # Modo de usar: -
  9. #-------------------------------------------------------------------------------
  10. # Agradecimentos Especiais: Hirofumi Watanabe (autor), Zachary Landau
  11. #-------------------------------------------------------------------------------
  12. #===============================================================================
  13.  
  14. class << File
  15.   BUFFER_SIZE = 8 * 1024
  16.  
  17. #===============================================================================
  18. # Se <to> é um diretório válido, <from> será combinado(append) <to>, colocando
  19. # as barras invertidas quando necessárias. Caso contrário, <to> será retornado.
  20. # Útil para compor um diretório com <from> e <to> se somente o nome do arquivo
  21. # for especificado em <to>.
  22. #===============================================================================
  23.   def append_dir(from, to)
  24.     if directory? to
  25.       join to.sub(%r([/\\]$), ''), basename(from)
  26.     else
  27.       return to
  28.     end
  29.   end
  30.  
  31. #===============================================================================
  32. # Copia um arquivo de <from> para <to>. Se <to> é um diretório, copia <from>
  33. # para <to/from>.
  34. #===============================================================================
  35.   def copy(from, to)
  36.     to = append_dir(from, to)
  37.     fmode = stat(from).mode
  38.     tpath = to
  39.     not_exist = !exist?(tpath)
  40.  
  41.     from = open(from, "rb")
  42.     to = open(to, "wb")
  43.     begin
  44.       while true
  45.         to.syswrite from.sysread(BUFFER_SIZE)
  46.       end
  47.     rescue EOFError
  48.       ret = true
  49.     rescue
  50.       ret = false
  51.     ensure
  52.       to.close
  53.       from.close
  54.     end
  55.     chmod(fmode, tpath) if not_exist
  56.     return ret
  57.   end
  58.  
  59. #===============================================================================
  60. # Move um arquivo de <from> para <to> usando o comando 'copy'. Se <to> é um
  61. # diretório, copia from para <to/from>.
  62. #
  63. #===============================================================================
  64.   def move(from, to)
  65.     to = append_dir(from, to)
  66.    
  67.     if RUBY_PLATFORM =~ /djgpp|(cyg|ms|bcc)win|mingw/ and file? to
  68.       unlink to
  69.     end
  70.     fstat = stat(from)
  71.     begin
  72.       rename from, to
  73.     rescue
  74.       from_stat = stat(from)
  75.       copy from, to and unlink from
  76.       utime(from_stat.atime, from_stat.mtime, to)
  77.       begin
  78.         chown(fstat.uid, fstat.gid, to)
  79.       rescue
  80.       end
  81.     end
  82.   end
  83.  
  84. #===============================================================================
  85. # Retorna <true> (verdadeiro) se os conteúdos dos arquivos <from> e <to> forem
  86. # idênticos.
  87. #===============================================================================
  88.   def compare(from, to)
  89.     return false if stat(from).size != stat(to).size
  90.     from = open(from, "rb")
  91.     to = open(to, "rb")
  92.     ret = false
  93.     fr = tr = ''
  94.  
  95.     begin
  96.       while fr == tr
  97.         fr = from.read(BUFFER_SIZE)
  98.         if fr
  99.           tr = to.read(fr.size)
  100.         else
  101.           ret = to.read(BUFFER_SIZE)
  102.           ret = !ret || ret.length == 0
  103.           break
  104.         end
  105.       end
  106.     rescue
  107.       ret = false
  108.     ensure
  109.       to.close
  110.       from.close
  111.     end
  112.     ret
  113.   end
  114.  
  115. #===============================================================================
  116. # Remove uma lista de arquivos. Cada parâmetro deve ser o nome de um arquivo a
  117. # ser excluído. Retorna o número de arquivos apagados.
  118. #===============================================================================
  119.   def remove_files(*files)    
  120.     files.each do |file|
  121.       begin
  122.         unlink file        
  123.       rescue Errno::EACCES # para Windows
  124.         continue if symlink? file
  125.         begin
  126.           mode = stat(file).mode
  127.           o_chmod mode | 0200, file
  128.           unlink file          
  129.         rescue
  130.           o_chmod mode, file rescue nil
  131.         end
  132.       rescue
  133.       end
  134.     end
  135.   end
  136.  
  137. #===============================================================================
  138. # Cria um direório e todos os seus "diretórios pais". Por exemplo:
  139. # File.make_dirs 'C:/Users/Admin/RPGVX'
  140. # Faz com que os seguintes diretórios sejam criados, se eles não existirem:
  141. #  * C:/Users
  142. #  * C:/Users/Admin
  143. #  * C:/Users/Admin/RPGVX
  144. #===============================================================================
  145.   def make_dirs(*dirs)    
  146.     mode = 0755
  147.     for dir in dirs
  148.       parent = dirname(dir)
  149.       next if parent == dir or directory? dir
  150.       make_dirs parent unless directory? parent      
  151.       if basename(dir) != ""
  152.         begin
  153.           Dir.mkdir dir, mode
  154.         rescue SystemCallError
  155.           raise unless directory? dir
  156.         end
  157.       end
  158.     end
  159.   end
  160.  
  161. #===============================================================================
  162. # Se <from> não for o mesmo que <to>, o copia e muda o modo de permissão para
  163. # <mode>. Se <to> for um diretório, o destino será <from/to>. Se <mode> não for
  164. # setado, o padrão será usado.
  165. #===============================================================================
  166.   def install(from, to, mode = nil)
  167.     to = append_dir(from, to)
  168.     unless exist? to and compare from, to
  169.       remove_files to if exist? to
  170.       copy from, to
  171.       chmod mode, to
  172.     end
  173.   end
  174.  
  175. end
  176.  
Advertisement
Add Comment
Please, Sign In to add comment