Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #===============================================================================
- # RAFAEL_SOL_MAKER's VX FILE CLASS ENTENSION v.1.0
- # (Baseado no módulo 'ftools.rb', de um módulo padrão do Ruby)
- #-------------------------------------------------------------------------------
- # Descrição: Extensão para o módulo File, para aumentar o número de funções e
- # consequentemente melhorar a tarefa da manipulação de arquivos.
- #-------------------------------------------------------------------------------
- # Modo de usar: -
- #-------------------------------------------------------------------------------
- # Agradecimentos Especiais: Hirofumi Watanabe (autor), Zachary Landau
- #-------------------------------------------------------------------------------
- #===============================================================================
- class << File
- BUFFER_SIZE = 8 * 1024
- #===============================================================================
- # Se <to> é um diretório válido, <from> será combinado(append) <to>, colocando
- # as barras invertidas quando necessárias. Caso contrário, <to> será retornado.
- # Útil para compor um diretório com <from> e <to> se somente o nome do arquivo
- # for especificado em <to>.
- #===============================================================================
- def append_dir(from, to)
- if directory? to
- join to.sub(%r([/\\]$), ''), basename(from)
- else
- return to
- end
- end
- #===============================================================================
- # Copia um arquivo de <from> para <to>. Se <to> é um diretório, copia <from>
- # para <to/from>.
- #===============================================================================
- def copy(from, to)
- to = append_dir(from, to)
- fmode = stat(from).mode
- tpath = to
- not_exist = !exist?(tpath)
- from = open(from, "rb")
- to = open(to, "wb")
- begin
- while true
- to.syswrite from.sysread(BUFFER_SIZE)
- end
- rescue EOFError
- ret = true
- rescue
- ret = false
- ensure
- to.close
- from.close
- end
- chmod(fmode, tpath) if not_exist
- return ret
- end
- #===============================================================================
- # Move um arquivo de <from> para <to> usando o comando 'copy'. Se <to> é um
- # diretório, copia from para <to/from>.
- #
- #===============================================================================
- def move(from, to)
- to = append_dir(from, to)
- if RUBY_PLATFORM =~ /djgpp|(cyg|ms|bcc)win|mingw/ and file? to
- unlink to
- end
- fstat = stat(from)
- begin
- rename from, to
- rescue
- from_stat = stat(from)
- copy from, to and unlink from
- utime(from_stat.atime, from_stat.mtime, to)
- begin
- chown(fstat.uid, fstat.gid, to)
- rescue
- end
- end
- end
- #===============================================================================
- # Retorna <true> (verdadeiro) se os conteúdos dos arquivos <from> e <to> forem
- # idênticos.
- #===============================================================================
- def compare(from, to)
- return false if stat(from).size != stat(to).size
- from = open(from, "rb")
- to = open(to, "rb")
- ret = false
- fr = tr = ''
- begin
- while fr == tr
- fr = from.read(BUFFER_SIZE)
- if fr
- tr = to.read(fr.size)
- else
- ret = to.read(BUFFER_SIZE)
- ret = !ret || ret.length == 0
- break
- end
- end
- rescue
- ret = false
- ensure
- to.close
- from.close
- end
- ret
- end
- #===============================================================================
- # Remove uma lista de arquivos. Cada parâmetro deve ser o nome de um arquivo a
- # ser excluído. Retorna o número de arquivos apagados.
- #===============================================================================
- def remove_files(*files)
- files.each do |file|
- begin
- unlink file
- rescue Errno::EACCES # para Windows
- continue if symlink? file
- begin
- mode = stat(file).mode
- o_chmod mode | 0200, file
- unlink file
- rescue
- o_chmod mode, file rescue nil
- end
- rescue
- end
- end
- end
- #===============================================================================
- # Cria um direório e todos os seus "diretórios pais". Por exemplo:
- # File.make_dirs 'C:/Users/Admin/RPGVX'
- # Faz com que os seguintes diretórios sejam criados, se eles não existirem:
- # * C:/Users
- # * C:/Users/Admin
- # * C:/Users/Admin/RPGVX
- #===============================================================================
- def make_dirs(*dirs)
- mode = 0755
- for dir in dirs
- parent = dirname(dir)
- next if parent == dir or directory? dir
- make_dirs parent unless directory? parent
- if basename(dir) != ""
- begin
- Dir.mkdir dir, mode
- rescue SystemCallError
- raise unless directory? dir
- end
- end
- end
- end
- #===============================================================================
- # Se <from> não for o mesmo que <to>, o copia e muda o modo de permissão para
- # <mode>. Se <to> for um diretório, o destino será <from/to>. Se <mode> não for
- # setado, o padrão será usado.
- #===============================================================================
- def install(from, to, mode = nil)
- to = append_dir(from, to)
- unless exist? to and compare from, to
- remove_files to if exist? to
- copy from, to
- chmod mode, to
- end
- end
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement