Advertisement
Rafael_Sol_Maker

RAFAEL_SOL_MAKER's VX FILE CLASS ENTENSION v.1.0

Nov 17th, 2011
157
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
Advertisement