Usando apenas a biblioteca padrão Prisma, vamos criar uma função para verificar se um arquivo ou pasta existe, e outra para calcular o tamanho de um arquivo.
Vamos aos códigos.
Para verificar a existência de um arquivo, basta tentar abri-lo:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
funcao Arquivo_existe(a) local b,err=es.abra(a,'leiturabin'); se nao b entao retorne falso, err senao b:feche(); retorne verdadeiro fim fim imprima(Arquivo_existe("teste.txt")); //--> falso arquivo ou diretorio nao encontrado imprima(Arquivo_existe(args[0])); //--> verdadeiro //args[0] é o próprio programa Prisma atual |
A mesma função também verifica se uma pasta existe:
1 2 |
imprima(Arquivo_existe("Documentos")); //-->verdadeiro |
Para obter o tamanho em bytes de um arquivo basta lê-lo em modo binário e medir seu tamanho com o ‘#’;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
funcao Arquivo_tamanho(arq) local a,err = es.abra(arq,'leiturabin'); se a entao local tam = #(a:leia('*t')); a:feche(); retorne tam; senao retorne falso, err; fim fim imprima('Tamanho de',args[0],':', Arquivo_tamanho(args[0]),'bytes'); //-->Tamanho de liste.prisma : 862 bytes |
Nós podemos melhorar a função acima, pois há um ponto fraco nela:
É necessário ler todo o arquivo em uma string, e se o arquivo for muito grande ocorrerá um erro ou demorará muito, como fazer então?
Usaremos uma técnica muito boa, vamos abrir o arquivo e mover o ponteiro para o final do arquivo, assim imediatamente teremos os bytes do arquivo:
1 2 3 4 5 6 7 8 9 10 |
funcao Arquivo_tamanho(arq) local a,err = es.abra(arq,'leiturabin'); se a entao local pos = a:busque('final'); a:feche(); retorne pos; senao retorne falso, err; fim fim |
Veja que usei um método pouco comentado, o :busque();
Ele aceita os seguintes parâmetros:
1 2 3 4 5 6 7 8 9 |
a:busque('final'); //vai para o fim do arquivo e retorna a posição em bytes. a:busque('def'); //vai para o inicio do arquivo e retorna 0; a:busque('atual'); //retorna posição atual da leitura. a:busque('def',100); //move a posição de leitura para a posição 100 e retorna. a:busque(); //sem parâmetros, retorna a posição atual. |
Obs.: ‘def’ vem de ‘defina’
Outro segredo é que se nós passarmos um número na função leia() ao lermos um arquivo será lido aquela quantidade de bytes por vez ou ao ler dados do teclado serão lidos apenas até o número passado como parâmetro.
Ex.:
1 2 3 4 5 6 7 8 9 10 11 12 |
local a, err = es.abra(args[0],'leitura'); se a entao local s,bloco = '',100; //bloco = 100 bytes //se quisesse poderia ser 1KB = 1000 ou 1MB = 1000000 repita imprima(s); s = a:leia(bloco); leia(); //pausa ate nao s; //até que s não seja valido. a:feche();//nunca se esqueça de fechar o arquivo. senao erro(err); fim |
A função acima lê 100 bytes por vez, mas poderia ser 1000 bytes (1KB), 1000000 bytes (1MB) etc.
É isso, se você usar a criatividade, poderá fazer muitas funções como esta a partir das bibliotecas padrão em Prisma.
Até mais.
Qualquer pergunta ou crítica deixe nos comentários.