{"id":3031,"date":"2017-06-06T13:23:55","date_gmt":"2017-06-06T17:23:55","guid":{"rendered":"http:\/\/linguagemprisma.br4.biz\/blog\/?p=3031"},"modified":"2017-06-10T10:20:25","modified_gmt":"2017-06-10T14:20:25","slug":"verificando-se-um-arquivo-ou-pasta-existe-e-o-tamanho","status":"publish","type":"post","link":"https:\/\/linguagemprisma.br4.biz\/blog\/prisma\/verificando-se-um-arquivo-ou-pasta-existe-e-o-tamanho\/","title":{"rendered":"Verificando se um arquivo ou pasta existe e o tamanho"},"content":{"rendered":"<p>Usando apenas a biblioteca padr\u00e3o Prisma, vamos criar uma fun\u00e7\u00e3o para verificar se um arquivo ou pasta existe, e outra para calcular o tamanho de um arquivo.<\/p>\n<p>Vamos aos c\u00f3digos.<\/p>\n<p>Para verificar a exist\u00eancia de um arquivo, basta tentar abri-lo:<\/p>\n<pre class=\"lang:prisma decode:true\">funcao Arquivo_existe(a)\r\n  local b,err=es.abra(a,'leiturabin');\r\n  se nao b entao retorne falso, err\r\n  senao \r\n     b:feche();\r\n     retorne verdadeiro\r\n  fim\r\nfim\r\n\r\nimprima(Arquivo_existe(\"teste.txt\"));\r\n\/\/--&gt; falso arquivo ou diretorio nao encontrado\r\nimprima(Arquivo_existe(args[0]));\r\n\/\/--&gt; verdadeiro  \/\/args[0] \u00e9 o pr\u00f3prio programa Prisma atual\r\n\r\n<\/pre>\n<p>A mesma fun\u00e7\u00e3o tamb\u00e9m verifica se uma pasta existe:<\/p>\n<pre class=\"lang:prisma decode:true\">imprima(Arquivo_existe(\"Documentos\"));\r\n\/\/--&gt;verdadeiro<\/pre>\n<p>&nbsp;<\/p>\n<p>Para obter o tamanho em bytes de um arquivo basta l\u00ea-lo em modo bin\u00e1rio e medir seu tamanho com o &#8216;#&#8217;;<\/p>\n<pre class=\"lang:prisma decode:true\">funcao Arquivo_tamanho(arq)\r\n  local a,err = es.abra(arq,'leiturabin');\r\n  se a entao\r\n    local tam = #(a:leia('*t')); \r\n    a:feche();\r\n    retorne tam;\r\n  senao\r\n    retorne falso, err;\r\n  fim\r\nfim\r\n\r\nimprima('Tamanho de',args[0],':', Arquivo_tamanho(args[0]),'bytes');\r\n\r\n\/\/--&gt;Tamanho de\tliste.prisma\t:\t862\tbytes\r\n<\/pre>\n<p>N\u00f3s podemos melhorar a fun\u00e7\u00e3o acima, pois h\u00e1 um ponto fraco nela:<\/p>\n<p>\u00c9 necess\u00e1rio ler todo o arquivo em uma string, e se o arquivo for muito grande ocorrer\u00e1 um erro ou demorar\u00e1 muito, como fazer ent\u00e3o?<\/p>\n<p>Usaremos uma t\u00e9cnica muito boa, vamos abrir o arquivo e mover o ponteiro para o final do arquivo, assim imediatamente teremos os bytes do arquivo:<\/p>\n<pre class=\"lang:prisma decode:true \">funcao Arquivo_tamanho(arq)\r\n  local a,err = es.abra(arq,'leiturabin');\r\n  se a entao\r\n    local pos = a:busque('final');\r\n    a:feche();\r\n    retorne pos;\r\n  senao\r\n    retorne falso, err;\r\n  fim\r\nfim<\/pre>\n<p>Veja que usei um m\u00e9todo pouco comentado, o :busque();<\/p>\n<p>Ele aceita os seguintes par\u00e2metros:<\/p>\n<pre class=\"lang:prisma decode:true \">a:busque('final'); \/\/vai para o fim do arquivo e retorna a posi\u00e7\u00e3o em bytes.\r\n\r\na:busque('def'); \/\/vai para o inicio do arquivo e retorna 0;\r\n\r\na:busque('atual'); \/\/retorna posi\u00e7\u00e3o atual da leitura.\r\n\r\na:busque('def',100); \/\/move a posi\u00e7\u00e3o de leitura para a posi\u00e7\u00e3o 100 e retorna.\r\n\r\na:busque(); \/\/sem par\u00e2metros, retorna a posi\u00e7\u00e3o atual.<\/pre>\n<p>Obs.: &#8216;def&#8217; vem de &#8216;defina&#8217;<\/p>\n<p>Outro segredo \u00e9 que se n\u00f3s passarmos um n\u00famero na fun\u00e7\u00e3o leia() ao lermos um arquivo ser\u00e1 lido aquela quantidade de bytes por vez ou ao ler dados do teclado ser\u00e3o lidos apenas at\u00e9 o n\u00famero passado como par\u00e2metro.<\/p>\n<p>Ex.:<\/p>\n<pre class=\"lang:prisma decode:true\">local a, err = es.abra(args[0],'leitura');\r\nse a entao\r\n  local s,bloco = '',100; \/\/bloco = 100 bytes \/\/se quisesse poderia ser 1KB = 1000 ou 1MB = 1000000\r\n  repita\r\n    imprima(s);\r\n    s = a:leia(bloco);\r\n    leia(); \/\/pausa\r\n  ate nao s; \/\/at\u00e9 que s n\u00e3o seja valido.\r\n  a:feche();\/\/nunca se esque\u00e7a de fechar o arquivo.\r\nsenao\r\n  erro(err);\r\nfim<\/pre>\n<p>A fun\u00e7\u00e3o acima l\u00ea 100 bytes por vez, mas poderia ser 1000 bytes (1KB), 1000000\u00a0bytes (1MB) etc.<\/p>\n<p>\u00c9 isso, se voc\u00ea usar a criatividade, poder\u00e1 fazer muitas fun\u00e7\u00f5es como esta a partir das bibliotecas padr\u00e3o em Prisma.<\/p>\n<p>At\u00e9 mais.<\/p>\n<p>Qualquer pergunta ou cr\u00edtica deixe nos coment\u00e1rios.<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Usando apenas a biblioteca padr\u00e3o Prisma, vamos criar uma fun\u00e7\u00e3o para verificar se um arquivo ou pasta existe, e outra para calcular o tamanho de um arquivo. Vamos aos c\u00f3digos. Para verificar a exist\u00eancia de um arquivo, basta tentar abri-lo: funcao Arquivo_existe(a) local b,err=es.abra(a,&#8217;leiturabin&#8217;); se nao b entao retorne falso, err senao b:feche(); retorne verdadeiro&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[24,7],"tags":[],"class_list":["post-3031","post","type-post","status-publish","format-standard","hentry","category-arquivos","category-prisma"],"_links":{"self":[{"href":"https:\/\/linguagemprisma.br4.biz\/blog\/wp-json\/wp\/v2\/posts\/3031","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/linguagemprisma.br4.biz\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/linguagemprisma.br4.biz\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/linguagemprisma.br4.biz\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/linguagemprisma.br4.biz\/blog\/wp-json\/wp\/v2\/comments?post=3031"}],"version-history":[{"count":7,"href":"https:\/\/linguagemprisma.br4.biz\/blog\/wp-json\/wp\/v2\/posts\/3031\/revisions"}],"predecessor-version":[{"id":3042,"href":"https:\/\/linguagemprisma.br4.biz\/blog\/wp-json\/wp\/v2\/posts\/3031\/revisions\/3042"}],"wp:attachment":[{"href":"https:\/\/linguagemprisma.br4.biz\/blog\/wp-json\/wp\/v2\/media?parent=3031"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/linguagemprisma.br4.biz\/blog\/wp-json\/wp\/v2\/categories?post=3031"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/linguagemprisma.br4.biz\/blog\/wp-json\/wp\/v2\/tags?post=3031"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}