Manipulação de Ficheiros com Ruby
14 Março, 2008
Directórios
1 WORK_DIR = "/home/magician/" 2 3 if Dir.pwd != WORK_DIR 4 Dir.chdir( WORK_DIR ) 5 end 6 7 Dir.foreach( WORK_DIR ) { |nome| puts nome }
É possível ainda criar e eliminar directórios de forma muito simples, bastando usar os métodos mkdir e rmdir que a classe Dir dispõe.
1 Dir.mkdir( "/home/magician/Ruby", 755 ) 2 3 Dir.rmdir( "/home/magician/Ruby" )
O exemplo acima não faz mais do que criar um directório no caminho dado e com as permissões dadas. Estas permissões são opcionais, podemos apenas dar o caminho. Em seguida eliminamos o directório criado com o método rmdir. Podíamos utilizar o método delete em detrimento ao método rmdir, pois ambos fazem exactamente o mesmo.
A classe dir também permite criar Streams a directórios, permitindo desta forma percorrer o conteúdo de directórios de forma mais flexível do que usando o método foreach mostrado anteriormente.
1 dir = Dir.open( "/home/magician/" ) 2 3 dir.path #=> "/home/magician" 4 5 dir.tell #=> 0 6 7 dir.read #=> "Ficheiro 1" 8 9 dir.tell #=> 599320 10 11 dir.read #=> "Ficheiro 2" 12 13 dir.rewind 14 15 dir.close
Como podemos ver na linha 1 é aberta uma ligação ao directório. A partir dai podemos, entre outras coisas, percorrer todos os ficheiros e directórios contidos no directório aberto. O método tell (linha 5 e 9) retorna a localização do apontador sob forma de inteiro, o método read (linha 7 e 11) retorna sob forma de String a próxima entrada no directório, retornando nil quando não existirem mais entradas. Por fim o método rewind (linha 13) permite colocar o apontador da stream de novo no inicio e método close (linha 15) fecha a ligação ao directório.
Ficheiros
1 file = File.new( "exemplo.txt", "w" )
O exemplo acima cria o ficheiro exemplo.txt e abre o ficheiro em modo de escrita. Vamos agora ver que outros modos de abertura e criação de ficheiros existem.
-
“r” – Read-Only. Começa no inicio do ficheiro.
-
“r+” – Read-Write. Começa no inicio do ficheiro.
-
“w” – Write-Only. Passa o tamanho do ficheiro a zero ou cria um novo ficheiro para escrita.
-
“w+” – Read-Write. Passa o tamanho do ficheiro a zero ou cria um novo ficheiro para escrita e leitura.
-
“a” – Write-Only. Começa no fim do ficheiro caso este exista, caso contrário cria o ficheiro para escrita.
-
“a+” – Read-Write. Começa no fim do ficheiro caso este exista, caso contrário cria o ficheiro para escrita e leitura.
-
“b” – (DOS/WIN only) Binary.
Depois de criarmos um ficheiro, podemos precisar de apagar o ficheiro ou até mesmo mudar o nome desse ficheiro. Este processo é também muito simples, para isso a classe File disponibiliza os métodos rename e delete que permitem estas operações.
1 File.new( "exemplo.txt", "w" ) 2 File.rename( "exemplo.txt", "novoExemplo.txt" ) 3 File.delete( "novoExemplo.txt" )
O exemplo acima cria o ficheiro “exemplo.txt” (linha 1), em seguida o nome do ficheiro é modificado de “exemplo.txt” para “novoExemplo.txt” (linha 2), por fim o ficheiro é eliminado (linha 3).
A classe File permite ainda realizar mais algumas operações úteis, como por exemplo verificar se um ficheiro existe, se é um directório, se é possível ler ou escrever no ficheiro, entre outras. Vamos ver alguns exemplos:
1 File.exist?( "ficheiro.txt" ) 2 3 File.file?( "ficheiro.txt" ) 4 5 File.directory?( "ficheiro.txt" ) 6 7 File.readable?( "ficheiro.txt" ) 8 9 File.writable?( "ficheiro.txt" ) 10 11 File.executable?( "ficheiro.txt" ) 12 13 File.zero?( "ficheiro.txt" ) 14 15 File.size( "ficheiro.txt" ) 16 17 File.size?( "ficheiro.txt" )
O exemplo mostra algumas das mais importantes operações sobre ficheiros. Na linha 1, o método exist? verifica se o ficheiro existe retornando true ou false, em seguida nas linhas 3 e 5 verificam se o ficheiro dado no path é realmente um ficheiro ou se é um directório. Nas linhas 7 e 9 os métodos readable? e writable? verificam se é possível ler ou escrever no ficheiro e na linha 11 o método executable verifica se o ficheiro é ou não executável. No final do exemplo podemos ver os métodos zero?, size e size?. O método zero? verifica se o ficheiro tem ou não tamanho igual a zero, os métodos size e size? fazem exactamente o mesmo que retornar o tamanho do ficheiro em bytes, com a diferença que caso este seja nulo, o primeiro retorna 0 e o segundo nil. Para além destes métodos é ainda possível obter mais algumas informações sobre os ficheiros como por exemplo data de criação, de edição e do ultimo acesso. Vamos por isso ver um exemplo desta funcionalidades.
1 File.ctime( "ficheiro.txt" ) #=> Thu Jan 21 19:55:16 +0000 2008 2 3 File.mtime( "ficheiro.txt" ) #=> Thu Jan 21 19:55:16 +0000 2008 4 5 File.atime( "ficheiro.txt" ) #=> Thu Jan 25 19:55:16 +0000 2008
Como podemos ver, na linha 1 o método ctime retorna uma String como a apresentada acima com a data e hora a que o ficheiro foi criado, o mesmo se passando com os métodos mtime (linha 3) e atime (linha 5), mas neste caso estes métodos retornam a informação referente à ultima modificação e ao ultimo acesso do ficheiro respectivamente.
A classe File tem ainda mais um recurso bastante útil que é o chmod. Este método permite alterar as permissões de acesso ao ficheiro. As masks para as permissões são as seguintes.
r – read
w – write
x – execute
-
0700 – rwx para o dono.
-
0400 – r para o dono.
-
0200 – w para o dono.
-
0100 – x para o dono.
-
0070 – rwx para o grupo.
-
0040 – r para o grupo.
-
0020 – w para o grupo.
-
0010 – x para o grupo.
-
0007 – rwx para os outros.
-
0004 – r para os outros.
-
0002 – w para os outros.
-
0001 – x para os outros.
-
4000 – Altera o user ID na execução.
-
2000 – Altera o group ID na execução.
-
1000 – Salva texto em swap mesmo depois de usar.
A utilização do método chmod é muito simples, basta abrir o ficheiro como foi mostrado anteriormente e executar o método chmod.
1 file = File.new( "ficheiro.txt", "r" ) 2 file.chmod( 0644 )
O exemplo acima dá permissão de de leitura de escrita (4 + 2) ao dono e de leitura ao grupo e todos os outros utilizadores.
Input/Ouput de Ficheiros
1 src = File.open("exemplo.txt","r") 2 3 puts src.readline #=> Linha 1 4 puts src.readline #=> Linha 2 5 puts src.readline #=> Linha 3 6 7 src.flush 8 src.close
O exemplo acima abre o ficheiro em modo de leitura e lê as três primeiras linhas do ficheiro. Podíamos ainda utilizar o método gets que tem exactamente o mesmo funcionamento, com excepção de que o readline lança uma excepção quando o ficheiro chega ao fim. Para além de ler é também possível escrever para o ficheiro.
1 dst = File.open("exemplo.txt","w") 2 3 dst.puts("Linha 1") 4 dst.puts("Linha 2") 5 dst.puts("Linha 3") 6 7 dst.flush 8 dst.close
Este exemplo utiliza o método puts para escrever no ficheiro de destino, a cada execução do puts é automaticamente inserido um “\n”, para escrever sem a inserção de nova linha podemos utilizar o método putc este método coloca um carácter e cada vez. Assim encerramos o artigo com toda a informação básica necessária para trabalhar com ficheiros.
RSS - Posts