Página 1 de 2

erro na função file()

Enviado: 11 Ago 2014 01:03
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?

erro na função file()

Enviado: 11 Ago 2014 09:16
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.

erro na função file()

Enviado: 11 Ago 2014 09:21
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

erro na função file()

Enviado: 15 Ago 2014 20:48
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?

erro na função file()

Enviado: 16 Ago 2014 10:39
por Jairo Maia
Muito estranho! Coloquei alguns dados na nvestr e testei seu bloco, não deu nada errado. Muito estranho isso...

erro na função file()

Enviado: 16 Ago 2014 11:26
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.

erro na função file()

Enviado: 16 Ago 2014 11:34
por cjp
Mas estou usando a função local, não é em rede.

Tem função no Harbour equivalente à file()? Qual?

erro na função file()

Enviado: 16 Ago 2014 11:56
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.

erro na função file()

Enviado: 16 Ago 2014 12:17
por cjp
Eu não uso set path nem set default, nunca.

Vou testar do jeito que vc falou e depois eu posto.

erro na função file()

Enviado: 16 Ago 2014 12:19
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.

erro na função file()

Enviado: 16 Ago 2014 12:30
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.

erro na função file()

Enviado: 16 Ago 2014 23:50
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...

erro na função file()

Enviado: 17 Ago 2014 02:59
por Jairo Maia
Valeu Alexandre. Tem razão. Obrigado.

erro na função file()

Enviado: 23 Nov 2018 18:04
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...

erro na função file()

Enviado: 23 Nov 2018 18:33
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