Como testar se um arquivo existe ou não

classic Classic list List threaded Threaded
8 messages Options
Reply | Threaded
Open this post in threaded view
|

Como testar se um arquivo existe ou não

psdias2
Pessoal:

Com a ajuda de vocês, aprendi sobre o comando "dofile", e vou usá-lo
para carregar alguns parâmetros do meu programa (em um arquivo que
batizarei, por exemplo, de "xyz.cfg").

Porém, antes de executar o "dofile", eu gostaria de poder testar
se o arquivo de configurações existe e, caso ainda não exista,
eu o criarei, com alguns parâmetros default.

Lendo o PDF "Programming in Lua 2ND Edition", de ROBERTO IERUSALIMSCHY,
páginas 69 e seguintes, vi que o único modo de checar se um arquivo existe é tentar abri-lo.

Então, criei o código abaixo, onde faço um "assert" com "io.open"
(vi essa orientação no PDF acima), para tentar interceptar o erro ao abrir o arquivo.
No final desta mensagem, estou enviando meu código, para deixar mais claro o que estou tentando
fazer.

Meu arquivo de configurações se chama "xyz.cfg" (é apenas um nome de teste). De propósito,
eu não criei o arquivo, para provocar o erro, e poder confirmar se meu código está
tratando esse erro corretamente.

Porém, ao rodar o programa, ocorre um erro na linha do "assert" (ver abaixo)
e o programa simplesmente "pára", exibindo a mensagem "No such file or directory".
O programa não chega na linha onde eu testo o resultado do comando "assert" e,
por isso, usar a dica do PDF não adianta nada.

Enfim, podem me dar alguma dica sobre como faço para testar se o arquivo existe ?

Observações:

a) É claro que eu pretendo distribuir um arquivo .cfg pré-preparado, junto com
meu programa e, neste caso, o erro ao abrir o arquivo não ocorrerá. Mas gostaria
de aprender a tratar esse tipo de erro em Lua, para o caso de eu precisar disso futuramente,
em situações em que eu não consiga ter certeza se existe ou não o arquivo a ser executado/aberto
(pelo dofile, ou pelo io.open).

b) Estou usando a linguagem Lua através do framework "MOAI" (pelo que percebi, nesta
lista ninguém usa o MOAI, mas como minha dúvida é sobre a linguagem Lua em si, creio
que vocês podem ter alguma dica útil).


Eis a rotina que eu criei:

--------------------------------------------------------------
function AbreArquivoDeConfiguracoes()
local bArquivoExiste
local sMensagem
local sNomeArqConfig = "xyz.cfg"

   bArquivoExiste, sMensagem = assert(io.open(sNomeArqConfig, "r"))

   if not bArquivoExiste then
      CriaArquivoDeConfiguracoes(sNomeArqConfig)
   end

   dofile(sNomeArqConfig)

end

Grato pela atenção de todos !
Paulo

--
--
Lua BR - http://groups.google.com/group/lua-br
 
---
Você está recebendo esta mensagem porque se inscreveu no grupo "Lua BR" dos Grupos do Google.
Para cancelar a inscrição neste grupo e parar de receber seus e-mails, envie um e-mail para [hidden email].
Para obter mais opções, acesse https://groups.google.com/groups/opt_out.
 
 
Reply | Threaded
Open this post in threaded view
|

Re: Como testar se um arquivo existe ou não

psdias2
Esqueci de comentar:

Já tentei usar a função pcall, também sugerida no livro a que me referi na mensagem anterior
(logo após a página 69), mas também não deu certo.  Nem vou me atrever a enviar o código em que
tentei usar o pcall, pois acho que fiquei confuso, e provavelmente não devo ter entendido o livro
corretamente.  Se alguém souber como usar o pcall para fazer a interceptação do erro a que me referi,
ficarei muito agradecido se me enviar um exemplo de código.

Grato pela atenção !
Paulo

--
--
Lua BR - http://groups.google.com/group/lua-br
 
---
Você está recebendo esta mensagem porque se inscreveu no grupo "Lua BR" dos Grupos do Google.
Para cancelar a inscrição neste grupo e parar de receber seus e-mails, envie um e-mail para [hidden email].
Para obter mais opções, acesse https://groups.google.com/groups/opt_out.
 
 
Reply | Threaded
Open this post in threaded view
|

Re: Como testar se um arquivo existe ou não

Alex Queiroz
In reply to this post by psdias2
Olá,

2013/3/7 psdias <[hidden email]>:
>
> Porém, antes de executar o "dofile", eu gostaria de poder testar
> se o arquivo de configurações existe e, caso ainda não exista,
> eu o criarei, com alguns parâmetros default.
>

Tente abrir o arquivo para leitura. Se você obtiver um erro, o arquivo
não existe ainda.

--
-alex
http://unendli.ch/

--
--
Lua BR - http://groups.google.com/group/lua-br

---
Você está recebendo esta mensagem porque se inscreveu no grupo "Lua BR" dos Grupos do Google.
Para cancelar a inscrição neste grupo e parar de receber seus e-mails, envie um e-mail para [hidden email].
Para obter mais opções, acesse https://groups.google.com/groups/opt_out.


Reply | Threaded
Open this post in threaded view
|

Re: Como testar se um arquivo existe ou não

Eric Chiesse
In reply to this post by psdias2

Tenta só isso:
pcall(dofile,"xyz.cfg")
Se teu arquivo existir a linha acima retorna true.


Em quarta-feira, 6 de março de 2013, psdias<[hidden email]> escreveu:
> Pessoal:
>
> Com a ajuda de vocês, aprendi sobre o comando "dofile", e vou usá-lo
> para carregar alguns parâmetros do meu programa (em um arquivo que
> batizarei, por exemplo, de "xyz.cfg").
>
> Porém, antes de executar o "dofile", eu gostaria de poder testar
> se o arquivo de configurações existe e, caso ainda não exista,
> eu o criarei, com alguns parâmetros default.
>
> Lendo o PDF "Programming in Lua 2ND Edition", de ROBERTO IERUSALIMSCHY,
> páginas 69 e seguintes, vi que o único modo de checar se um arquivo existe é tentar abri-lo.
>
> Então, criei o código abaixo, onde faço um "assert" com "io.open"
> (vi essa orientação no PDF acima), para tentar interceptar o erro ao abrir o arquivo.
> No final desta mensagem, estou enviando meu código, para deixar mais claro o que estou tentando
> fazer.
>
> Meu arquivo de configurações se chama "xyz.cfg" (é apenas um nome de teste). De propósito,
> eu não criei o arquivo, para provocar o erro, e poder confirmar se meu código está
> tratando esse erro corretamente.
>
> Porém, ao rodar o programa, ocorre um erro na linha do "assert" (ver abaixo)
> e o programa simplesmente "pára", exibindo a mensagem "No such file or directory".
> O programa não chega na linha onde eu testo o resultado do comando "assert" e,
> por isso, usar a dica do PDF não adianta nada.
>
> Enfim, podem me dar alguma dica sobre como faço para testar se o arquivo existe ?
>
> Observações:
>
> a) É claro que eu pretendo distribuir um arquivo .cfg pré-preparado, junto com
> meu programa e, neste caso, o erro ao abrir o arquivo não ocorrerá. Mas gostaria
> de aprender a tratar esse tipo de erro em Lua, para o caso de eu precisar disso futuramente,
> em situações em que eu não consiga ter certeza se existe ou não o arquivo a ser executado/aberto
> (pelo dofile, ou pelo io.open).
>
> b) Estou usando a linguagem Lua através do framework "MOAI" (pelo que percebi, nesta
> lista ninguém usa o MOAI, mas como minha dúvida é sobre a linguagem Lua em si, creio
> que vocês podem ter alguma dica útil).
>
>
> Eis a rotina que eu criei:
>
> --------------------------------------------------------------
> function AbreArquivoDeConfiguracoes()
> local bArquivoExiste
> local sMensagem
> local sNomeArqConfig = "xyz.cfg"
>
>    bArquivoExiste, sMensagem = assert(io.open(sNomeArqConfig, "r"))
>
>    if not bArquivoExiste then
>       CriaArquivoDeConfiguracoes(sNomeArqConfig)

>    end
>
>    dofile(sNomeArqConfig)
>
> end
>
> Grato pela atenção de todos !
> Paulo
>
> --
> --
> Lua BR - http://groups.google.com/group/lua-br
>  
> ---
> Você está recebendo esta mensagem porque se inscreveu no grupo "Lua BR" dos Grupos do Google.
> Para cancelar a inscrição neste grupo e parar de receber seus e-mails, envie um e-mail para [hidden email].
> Para obter mais opções, acesse https://groups.google.com/groups/opt_out.
>  
>  
>

--
---
Eric

--
--
Lua BR - http://groups.google.com/group/lua-br
 
---
Você está recebendo esta mensagem porque se inscreveu no grupo "Lua BR" dos Grupos do Google.
Para cancelar a inscrição neste grupo e parar de receber seus e-mails, envie um e-mail para [hidden email].
Para obter mais opções, acesse https://groups.google.com/groups/opt_out.
 
 
Reply | Threaded
Open this post in threaded view
|

Re: Como testar se um arquivo existe ou não

Elias Barrionovo
In reply to this post by psdias2
A função assert() existe justamente para levantar erros, i.e. parar a
execução do código abortando o interpretador.

Lua usa uma convenção (que eu acho sensacional) de que as funções,
quando encontrarem erros, retornam 'nil' seguido de uma explicação. A
função assert() [1] serve para essa convenção: quando o primeiro
parâmetro é nil ou false, ela dá um erro com a mensagem passada como
segundo parâmetro.

Se você não quiser que o programa "estoure" quando não encontrar o
arquivo, basta não chamar assert():

local f = io.open('filename', 'r')
if not f then
  f = create_config_file('filename')
end
...

[1]  Vide a referência das funções assert(), error() e pcall():
http://www.lua.org/manual/5.1/pt/manual.html#pdf-assert
http://www.lua.org/manual/5.1/pt/manual.html#pdf-error
http://www.lua.org/manual/5.1/pt/manual.html#pdf-pcall

--
NI!

--
--
Lua BR - http://groups.google.com/group/lua-br

---
Você está recebendo esta mensagem porque se inscreveu no grupo "Lua BR" dos Grupos do Google.
Para cancelar a inscrição neste grupo e parar de receber seus e-mails, envie um e-mail para [hidden email].
Para obter mais opções, acesse https://groups.google.com/groups/opt_out.


Reply | Threaded
Open this post in threaded view
|

Re: Como testar se um arquivo existe ou não

fecik
Voce iniciou o planejamento assim:
1- o usuario edita facilmente em texto os dados.
2- o programa suga para si os dados e os manipula.
.
E se os dados nao existem, o programa os cria?
Sua estrutura acima diz:
os dados sao responsabilidade do usuario.
.
assert(carregou(dados), "verifique em ../moldura/dados.cfg como deve
estar o ../valendo/dados.cfg, e la ensinamos pelos comentarios o que
deve substituir aqueles valores iniciais")
.
E distribuir os rigores do tipo "alem daqui? so com tal condicao" por
areas, vamos supor:
Os rigores que estarao ativos para a relacao sua com o codigo;
os ativos para a relacao programa-sistema;
e os para a relacao dentre usuario e programa.

--
--
Lua BR - http://groups.google.com/group/lua-br

---
Você está recebendo esta mensagem porque se inscreveu no grupo "Lua BR" dos Grupos do Google.
Para cancelar a inscrição neste grupo e parar de receber seus e-mails, envie um e-mail para [hidden email].
Para obter mais opções, acesse https://groups.google.com/groups/opt_out.


Reply | Threaded
Open this post in threaded view
|

Re: Como testar se um arquivo existe ou não

Eric Chiesse
In reply to this post by Eric Chiesse
Pensando melhor, chamar pcall(dofile, ...) pode não ser uma boa idéia
pois ele mascararia os erros ocorridos durante a execução do arquivo
de configuração. Mas vale o teste para você entender o processo.

Para algo simples e num escopo restrito eu usaria:

function fileExists(path)
    return io.open(path) ~= nil -- Só um exemplo do conceito. Se for
implementar mesmo tem que fechar o handle do arquivo.
end

Deve haver outras condições de erro além da inexistência do arquivo.
No mínimo quanto a restrições de acesso.

Dá uma olhada em LuaFileSystem
http://keplerproject.github.com/luafilesystem/manual.html (use:
require"lfs") talvez tenha alguma função lá que resolva exatamente o
que você quer.

Ou pra ter 100% de certeza pode implementar uma função fileExists em C
usando os recursos diretamente do SO. Eu acho que tenho uma
implementada para windows em casa. Se eu tiver te passo a dll mais
tarde.

---
Eric


Em 7 de março de 2013 09:49, Eric Chiesse <[hidden email]> escreveu:

>
> Tenta só isso:
> pcall(dofile,"xyz.cfg")
> Se teu arquivo existir a linha acima retorna true.
>
>
> Em quarta-feira, 6 de março de 2013, psdias<[hidden email]> escreveu:
>
>> Pessoal:
>>
>> Com a ajuda de vocês, aprendi sobre o comando "dofile", e vou usá-lo
>> para carregar alguns parâmetros do meu programa (em um arquivo que
>> batizarei, por exemplo, de "xyz.cfg").
>>
>> Porém, antes de executar o "dofile", eu gostaria de poder testar
>> se o arquivo de configurações existe e, caso ainda não exista,
>> eu o criarei, com alguns parâmetros default.
>>
>> Lendo o PDF "Programming in Lua 2ND Edition", de ROBERTO IERUSALIMSCHY,
>> páginas 69 e seguintes, vi que o único modo de checar se um arquivo existe
>> é tentar abri-lo.
>>
>> Então, criei o código abaixo, onde faço um "assert" com "io.open"
>> (vi essa orientação no PDF acima), para tentar interceptar o erro ao abrir
>> o arquivo.
>> No final desta mensagem, estou enviando meu código, para deixar mais claro
>> o que estou tentando
>> fazer.
>>
>> Meu arquivo de configurações se chama "xyz.cfg" (é apenas um nome de
>> teste). De propósito,
>> eu não criei o arquivo, para provocar o erro, e poder confirmar se meu
>> código está
>> tratando esse erro corretamente.
>>
>> Porém, ao rodar o programa, ocorre um erro na linha do "assert" (ver
>> abaixo)
>> e o programa simplesmente "pára", exibindo a mensagem "No such file or
>> directory".
>> O programa não chega na linha onde eu testo o resultado do comando
>> "assert" e,
>> por isso, usar a dica do PDF não adianta nada.
>>
>> Enfim, podem me dar alguma dica sobre como faço para testar se o arquivo
>> existe ?
>>
>> Observações:
>>
>> a) É claro que eu pretendo distribuir um arquivo .cfg pré-preparado, junto
>> com
>> meu programa e, neste caso, o erro ao abrir o arquivo não ocorrerá. Mas
>> gostaria
>> de aprender a tratar esse tipo de erro em Lua, para o caso de eu precisar
>> disso futuramente,
>> em situações em que eu não consiga ter certeza se existe ou não o arquivo
>> a ser executado/aberto
>> (pelo dofile, ou pelo io.open).
>>
>> b) Estou usando a linguagem Lua através do framework "MOAI" (pelo que
>> percebi, nesta
>> lista ninguém usa o MOAI, mas como minha dúvida é sobre a linguagem Lua em
>> si, creio
>> que vocês podem ter alguma dica útil).
>>
>>
>> Eis a rotina que eu criei:
>>
>> --------------------------------------------------------------
>> function AbreArquivoDeConfiguracoes()
>> local bArquivoExiste
>> local sMensagem
>> local sNomeArqConfig = "xyz.cfg"
>>
>>    bArquivoExiste, sMensagem = assert(io.open(sNomeArqConfig, "r"))
>>
>>    if not bArquivoExiste then
>>       CriaArquivoDeConfiguracoes(sNomeArqConfig)
>>    end
>>
>>    dofile(sNomeArqConfig)
>>
>> end
>>
>> Grato pela atenção de todos !
>> Paulo
>>
>> --
>> --
>> Lua BR - http://groups.google.com/group/lua-br
>>
>> ---
>> Você está recebendo esta mensagem porque se inscreveu no grupo "Lua BR"
>> dos Grupos do Google.
>> Para cancelar a inscrição neste grupo e parar de receber seus e-mails,
>> envie um e-mail para [hidden email].
>> Para obter mais opções, acesse https://groups.google.com/groups/opt_out.
>>
>>
>>
>
> --
> ---
> Eric

--
--
Lua BR - http://groups.google.com/group/lua-br

---
Você está recebendo esta mensagem porque se inscreveu no grupo "Lua BR" dos Grupos do Google.
Para cancelar a inscrição neste grupo e parar de receber seus e-mails, envie um e-mail para [hidden email].
Para obter mais opções, acesse https://groups.google.com/groups/opt_out.


Reply | Threaded
Open this post in threaded view
|

Re: Como testar se um arquivo existe ou não

Moises
In reply to this post by psdias2

function AbreArquivoDeConfiguracoes()
local bArquivoExiste
local sMensagem
local sNomeArqConfig = "xyz.cfg"

   bArquivoExiste = io.open(sNomeArqConfig, "r")

   if not bArquivoExiste then
      CriaArquivoDeConfiguracoes(sNomeArqConfig)
   else
   dofile(sNomeArqConfig)
 end
end