erro na função file()

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

Moderador: Moderadores

cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

erro na função file()

Mensagem por cjp »

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:

Código: Selecionar todos

if !file("mail1.dbf")
ou

Código: Selecionar todos

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
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

erro na função file()

Mensagem por Itamar M. Lins Jr. »

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.
Saudações,
Itamar M. Lins Jr.
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

erro na função file()

Mensagem por Jairo Maia »

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:

Código: Selecionar todos

if !file("mail1.dbf")  // se arquivo não existir...
 Hb_Alert( "Arquivo inexistente!" )
EndIf
ou idem aqui:

Código: Selecionar todos

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)
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

erro na função file()

Mensagem por cjp »

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:

Código: Selecionar todos

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
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

erro na função file()

Mensagem por Jairo Maia »

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 do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

erro na função file()

Mensagem por JoséQuintas »

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 mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

erro na função file()

Mensagem por cjp »

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

Tem função no Harbour equivalente à file()? Qual?
Inacio de Carvalho Neto
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

erro na função file()

Mensagem por Jairo Maia »

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:

Código: Selecionar todos

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)
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

erro na função file()

Mensagem por cjp »

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
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7928
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

erro na função file()

Mensagem por Itamar M. Lins Jr. »

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.

Código: Selecionar todos

    + 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.
Saudações,
Itamar M. Lins Jr.
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

erro na função file()

Mensagem por cjp »

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
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

erro na função file()

Mensagem por alxsts »

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:

Código: Selecionar todos

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)
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

erro na função file()

Mensagem por Jairo Maia »

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)
Emanuel
Usuário Nível 1
Usuário Nível 1
Mensagens: 24
Registrado em: 20 Set 2018 14:39
Localização: parnaiba-pi

erro na função file()

Mensagem por Emanuel »

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...

Código: Selecionar todos


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:

Código: Selecionar todos

 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
Registrado em: 20 Set 2018 14:39
Localização: parnaiba-pi

erro na função file()

Mensagem por Emanuel »

opa!!!
kkkk
depois de muito sofrimento, achei o problema

Código: Selecionar todos

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
Responder