Clipper On Line • Ver Tópico - erro na função file()

erro na função file()

Projeto Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

 

erro na função file()

Mensagempor cjp » 11 Ago 2014 01:03

Estou tendo problemas com a função file().

A ideia é verificar se uma base de dados existe. Sempre funcionou, mas agora não está funcionando.

Está retornando .t., mesmo quando o arquivo não existe.

Já tentei de duas formas:

if !file("mail1.dbf")


ou

if file("mail1.dbf")=.f.


Das duas formas, está indicando que o arquivo existe, mesmo quando ele não existe.

Alguém saberia dizer por que?
Inacio de Carvalho Neto
cjp
Usuário Nível 6

Usuário Nível 6
 
Mensagens: 1527
Data de registro: 19 Nov 2010 21:29
Cidade/Estado: paraná
Curtiu: 10 vezes
Mens.Curtidas: 20 vezes

erro na função file()

Mensagempor Itamar M. Lins Jr. » 11 Ago 2014 09:16

Verifique o PATH antes p/ ver onde o seu sistema está!
? curdir()
Ou use o PATH completo, file("c:\xyz\abdc\xxx.dbf")

Saudações,
Itamar M. Lins Jr.
Avatar de usuário

Itamar M. Lins Jr.
Colaborador

Colaborador
 
Mensagens: 6927
Data de registro: 30 Mai 2007 11:31
Cidade/Estado: Ilheus Bahia
Curtiu: 309 vezes
Mens.Curtidas: 503 vezes

erro na função file()

Mensagempor Jairo Maia » 11 Ago 2014 09:21

Inácio,

Assim: if !file("mail1.dbf") ou assim, if file("mail1.dbf")=.f. irá retornar .T. quando o arquivo não existir. É o que você está pedindo ao sistema. Veja:
if !file("mail1.dbf")  // se arquivo não existir...
Hb_Alert( "Arquivo inexistente!" )
EndIf
ou idem aqui:
if file("mail1.dbf")=.f.  // se arquivo não existir...
Hb_Alert( "Arquivo inexistente!" )
EndIf
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Avatar de usuário

Jairo Maia
Colaborador

Colaborador
 
Mensagens: 2733
Data de registro: 16 Ago 2010 13:46
Cidade/Estado: Campinas-SP
Curtiu: 371 vezes
Mens.Curtidas: 305 vezes

erro na função file()

Mensagempor cjp » 15 Ago 2014 20:48

Itamar, eu já havia testado, a pasta está correta.

Jairo, talvez eu não tenha me expressado direito, mas, quando eu disse que está retornando .t., não é da forma como vc disse. Meu código está assim:

if !file("mail1.dbf")
   dbcreate("mail1",nvestr)
   usebase("mail1")
endif


A ideia é que se o arquivo mail1.dbf não existir, ele o criaria. Ocorre que, mesmo que o arquivo não exista, ele não está entrando no if, ou seja, não está criando. Me entende?
Inacio de Carvalho Neto
cjp
Usuário Nível 6

Usuário Nível 6
 
Mensagens: 1527
Data de registro: 19 Nov 2010 21:29
Cidade/Estado: paraná
Curtiu: 10 vezes
Mens.Curtidas: 20 vezes

erro na função file()

Mensagempor Jairo Maia » 16 Ago 2014 10:39

Muito estranho! Coloquei alguns dados na nvestr e testei seu bloco, não deu nada errado. Muito estranho isso...
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Avatar de usuário

Jairo Maia
Colaborador

Colaborador
 
Mensagens: 2733
Data de registro: 16 Ago 2010 13:46
Cidade/Estado: Campinas-SP
Curtiu: 371 vezes
Mens.Curtidas: 305 vezes

erro na função file()

Mensagempor JoséQuintas » 16 Ago 2014 11:26

Vamos ver se é o mesmo problema que tive, mas que é o contrário: mostrar que não existe, mesmo existindo

Explicação:
O Windows pra ganhar velocidade não consulta o servidor toda hora.
Acabou de criar, ele diz que não existe, porque não consultou o servidor novamente após a criação.
O mesmo acontece nas outras estações, não enxergando este arquivo criado em outro terminal.
Fazer o que... faz parte do default atual do Windows.

Solução:
Configurar a rede Windows.
O Harbour tem uma função que faz isso, seria o mais prático.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18014
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

erro na função file()

Mensagempor cjp » 16 Ago 2014 11:34

Mas estou usando a função local, não é em rede.

Tem função no Harbour equivalente à file()? Qual?
Inacio de Carvalho Neto
cjp
Usuário Nível 6

Usuário Nível 6
 
Mensagens: 1527
Data de registro: 19 Nov 2010 21:29
Cidade/Estado: paraná
Curtiu: 10 vezes
Mens.Curtidas: 20 vezes

erro na função file()

Mensagempor Jairo Maia » 16 Ago 2014 11:56

Olá Inácio,

Não, porquê por ser uma função de baixo nível, tem que funcionar perfeitamente "sem embargos". Por via de dúvidas você poderia testar assim:
nArquivos:=Directory( "mail1.dbf" )
if nArquivos = 0
   dbcreate("mail1",nvestr)
   usebase("mail1")
endif
Mas é gambiarra, não é pra dar errado a função File(). Responda o seguinte:

Você não está em algum ponto de seu sistema usando a constante SET PATH TO <cPastaPadrao> ou SET DEFAULT TO <cPastaPadrão> ou ainda a função Set( _SET_PATH, <(pth)> ) ou a função Set( _SET_DEFAULT, <(path)> ), e não restaurando o Default?

Qualquer uma dessas coisas acima se estiver sendo usada, e na função File() o path for omintido, o Default é assumido, mesmo você checando que está na pasta certa do arquivo.
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Avatar de usuário

Jairo Maia
Colaborador

Colaborador
 
Mensagens: 2733
Data de registro: 16 Ago 2010 13:46
Cidade/Estado: Campinas-SP
Curtiu: 371 vezes
Mens.Curtidas: 305 vezes

erro na função file()

Mensagempor cjp » 16 Ago 2014 12:17

Eu não uso set path nem set default, nunca.

Vou testar do jeito que vc falou e depois eu posto.
Inacio de Carvalho Neto
cjp
Usuário Nível 6

Usuário Nível 6
 
Mensagens: 1527
Data de registro: 19 Nov 2010 21:29
Cidade/Estado: paraná
Curtiu: 10 vezes
Mens.Curtidas: 20 vezes

erro na função file()

Mensagempor Itamar M. Lins Jr. » 16 Ago 2014 12:19

Isso é porque vc usa drive "mapeado" ?
Use como eu escrevi. O caminho completo file("c:\meudir\meuarq.dbf").
Porque vc "pode" está chamando o seu executável de outra pasta c:\meuexec\xyz.exe, ele não vai enxergar os arquivos mesmo.
Use os novos comandos do harbour.
hb_DirBase()
hb_FileExists()
hb_PathNormalize()
...
Checar aquivos via MAPEAMENTO é fria. (abrir/gravar/criar) use o letodb, ou estude as novas funções que existem no harbour que trabalham via sockets.

    + added PRG interface to Harbour FILE IO API
      The following PRG functions are available for Harbour programmers:
         HB_VFEXISTS( <cFileName>, [ @<cDestFileName> ] ) -> <lOK>
         HB_VFERASE( <cFileName> ) -> <nResult>
         HB_VFRENAME( <cFileSrc>, <cFileDst> ) -> <nResult>
         HB_VFCOPYFILE( <cFileSrc>, <cFileDst> ) -> <nResult>
         HB_VFDIREXISTS( <cDirName> ) -> <lExists>
         HB_VFDIRMAKE( <cDirName> ) -> <nSuccess>
         HB_VFDIRREMOVE( <cDirName> ) -> <nSuccess>
         HB_VFDIRECTORY( [ <cDirSpec> ], [ <cAttr> ] ) -> <aDirectory>
         HB_VFDIRSPACE( <cDirName>, [ <nInfoType> ] ) -> <nFreeSpace>
         HB_VFATTRGET( <cFileName>, @<nAttr> ) -> <lOK>
         HB_VFATTRSET( <cFileName>,  <nAttr> ) -> <lOK>
         HB_VFTIMEGET( <cFileName>, @<tsDateTime> ) -> <lOK>
         HB_VFTIMESET( <cFileName>,  <tsDateTime> ) -> <lOK>
         HB_VFLINK( <cExistingFileName>, <cNewFileName> ) -> <nSuccess>
         HB_VFLINKSYM( <cTargetFileName>, <cNewFileName> ) -> <nSuccess>
         HB_VFLINKREAD( <cFileName> ) -> <cDestFileName> | ""
         HB_VFOPEN( <cFileName>, [ <nMode> ], [ <nAttr> ] ) -> <pHandle> | NIL
         HB_VFCLOSE( <pHandle> ) -> <lOK>
         HB_VFLOCK( <pHandle>, <nStart>, <nLen>, [ <nType> ] ) -> <lOK>
         HB_VFUNLOCK( <pHandle>, <nStart>, <nLen> ) -> <lOK>
         HB_VFLOCKTEST( <pHandle>, <nStart>, <nLen>, [ <nType> ] ) ;
               -> <nPID> | 0 (nolock) | -1 (err)
         HB_VFREAD( <pHandle>, @<cBuff>, [ <nToRead> ], [ <nTimeOut> ] ) ;
               -> <nRead>
         HB_VFWRITE( <pHandle>, <cBuff>, [ <nToWrite> ], [ <nTimeOut> ] ) ;
               -> <nWritten>
         HB_VFREADAT( <pHandle>, @<cBuff>, [ <nToRead> ], [ <nAtOffset> ] ) ;
               -> <nRead>
         HB_VFWRITEAT( <pHandle>, <cBuff>, [ <nToWrite> ], [ <nAtOffset> ] ) ;
               -> <nWritten>
         HB_VFSEEK( <pHandle>, <nOffset>, [ <nWhence> ] ) -> <nOffset>
         HB_VFTRUNC( <pHandle>, [ <nAtOffset> ] ) -> <lOK>
         HB_VFSIZE( <pHandle> ) -> <nSize>
         HB_VFEOF( <pHandle> ) -> <lEOF>
         HB_VFFLUSH( <pHandle>, [ <lDirtyOnly> ] ) -> NIL
         HB_VFCOMMIT( <pHandle> ) -> NIL
         HB_VFCONFIG( <pHandle>, <nSet>, [ <nParam> ] ) -> <nResult>
         HB_VFHANDLE( <pHandle> ) -> <nOsHandle>
         HB_VFTEMPFILE( @<cFileName>, [ <cDir> ], [ <cPrefix> ], [ <cExt> ], ;
                       [ <nAttr> ] ) -> <pHandle> | NIL
      Please remember that not all redirectors have to support all of them.
      I.e. MEMIO allows to use directory names in files but does not allow to
      create or remove directories. It also does not support file attributes
      and times in current implementation though it can be easy added.
      HB_VFCONFIG() is general function which can be used by redirector
      authors to make some special operations which are specific to given
      device.
      HB_VFTEMPFILE() always creates temporary files on local system without
      switching to FILE IO redirector. It's intentional behavior.

  * src/rtl/fscopy.c
    * used Harbour FILE IO API in hb_fsCopy()/HB_FCOPY()
      Please remember that HB_FCOPY() always makes operation using current
      system when HB_VFCOPY() may optimize it moving the operation to low
      level subsystem or even other computer i.e.  NETIO can do that  when
      both files are located on the same server.

  * src/rdd/delim1.c
  * src/rdd/sdf1.c
  * src/rdd/dbf1.c
  * src/rdd/dbfcdx/dbfcdx1.c
  * src/rdd/dbffpt/dbffpt1.c
  * src/rdd/dbfnsx/dbfnsx1.c
  * src/rdd/dbfntx/dbfntx1.c
  * src/rdd/hsx/hsx.c
    * open files with FXO_NOSEEKPOS attribute to inform low level API that
      read/write filepos is not used (disables unnecessary filepos emulation).

  * contrib/hbnetio/netio.h
  * contrib/hbnetio/netiocli.c
  * contrib/hbnetio/netiosrv.c
    + added support for extended Harbour FILE IO API.

  * contrib/hbnetio/utils/hbnetio/netiomgm.hb
    ! renamed "quit" command to "shutdown" as suggested by Rolf.

  * contrib/hbnetio/utils/hbnetio/hbnetio.prg
    * allow to interrupt server process using ESC when run in console window.

  * contrib/hbmemio/memio.c
    + added support for extended Harbour FILE IO API.
      I left two minor TODO notes - maybe someone will try to implement it.


Saudações,
Itamar M. Lins Jr.
Avatar de usuário

Itamar M. Lins Jr.
Colaborador

Colaborador
 
Mensagens: 6927
Data de registro: 30 Mai 2007 11:31
Cidade/Estado: Ilheus Bahia
Curtiu: 309 vezes
Mens.Curtidas: 503 vezes

erro na função file()

Mensagempor cjp » 16 Ago 2014 12:30

Na verdade não estou usando drive mapeado não. Essa função está verificando no disco local mesmo. Vou testar com a hb_FileExists(). Obrigado.
Inacio de Carvalho Neto
cjp
Usuário Nível 6

Usuário Nível 6
 
Mensagens: 1527
Data de registro: 19 Nov 2010 21:29
Cidade/Estado: paraná
Curtiu: 10 vezes
Mens.Curtidas: 20 vezes

erro na função file()

Mensagempor alxsts » 16 Ago 2014 23:50

Olá!
DIRECTORY()
Create an array of directory and file information
------------------------------------------------------------------------------
Syntax

DIRECTORY(<cDirSpec>, [<cAttributes>]) --> aDirectory

Jairo, permita-me um aparte: a função Directory() retorna um array. Precisaria fazer uma pequena alteração no teu código:
1   nArquivos := Len( Directory( "mail1.dbf" ) )
2   if nArquivos = 0
3      dbcreate("mail1",nvestr)
4      usebase("mail1")
5   endif
Quanto ao assunto do tópico, não parei para testar mas, nunca tive e nunca ouvi falar de problemas com esta função, a não ser o exposto acima pelo Quintas...
[]´s
Alexandre Santos (AlxSts)
alxsts
Colaborador

Colaborador
 
Mensagens: 2943
Data de registro: 12 Ago 2008 15:50
Cidade/Estado: São Paulo-SP-Brasil
Curtiu: 21 vezes
Mens.Curtidas: 248 vezes

erro na função file()

Mensagempor Jairo Maia » 17 Ago 2014 02:59

Valeu Alexandre. Tem razão. Obrigado.
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Avatar de usuário

Jairo Maia
Colaborador

Colaborador
 
Mensagens: 2733
Data de registro: 16 Ago 2010 13:46
Cidade/Estado: Campinas-SP
Curtiu: 371 vezes
Mens.Curtidas: 305 vezes

erro na função file()

Mensagempor Emanuel » 23 Nov 2018 17:04

ola galera...
boa tarde a todos

Eu estou com uma duvida aqui ja faz um bom tempo que tento solucionar, mas acho que não da muito certo do jeito que eu quero nn...

select novo
        cTabs := C_TABELA

        cTabs := STUFF(cTabs, len(alltrim(cTabs)) +1,0, ".dbf")
        cRoad := "/sist/projetos/pasta1/copy/" 

        If File(cRoad+cTabs)
            ? "tabela existente!", cTabs
        Else
            ? "tabela nao existe!", cTabs
        EndIf



O objetivo era saber se os dbf's que salvei no campo C_TABELA são iguais aos que existem no caminho que especifiquei no cRoad. eu tentei usar a função file(), mas não deu muito certo. Parece que isso que eu faço com as variaveis dentro da função não funciona.

Porem se eu fizer assim:
 If File("/sist/projetos/pasta1/copy/a_acesso.dbf")

assim funciona perfeitamente...

obs...
É a primeira vez que tento usar essa função...

att...
Emanuel
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 24
Data de registro: 20 Set 2018 14:39
Cidade/Estado: parnaiba-pi
Curtiu: 12 vezes
Mens.Curtidas: 0 vez

erro na função file()

Mensagempor Emanuel » 23 Nov 2018 17:33

opa!!!
kkkk
depois de muito sofrimento, achei o problema
cTabs := STUFF(cTabs, len(alltrim(cTabs)) +1 , 0, ".dbf")
        cRoad := "/sist/projetos/pasta1/copy/" 
        cTabs := alltrim(cTabs)


depois do .dbf existia espaços, ai usei o ALLTRIM() e pronto kkk, problema resolvido...

vlw galera -:]

até a proxima duvida rsrsrs
Emanuel
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 24
Data de registro: 20 Set 2018 14:39
Cidade/Estado: parnaiba-pi
Curtiu: 12 vezes
Mens.Curtidas: 0 vez

Próximo



Retornar para Harbour

Quem está online

Usuários vendo este fórum: Google [Bot] e 15 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro