Jump to content
Fivewin Brasil

ALTERNATIVA A FUNÇÃO FILE()


HASA

Recommended Posts

Emotta, aí sim, usando o ThreadSleep diminui o processamento (fica quase igual ao timer ou melhor), mas se usar inkey pode esperar a máquina apitar na curva.

João, estamos aí, não "Couve" nada, apenas uma dedicação em tempo mais que integral a um cliente, mas agora estamos na ativa novamente.

Link to comment
Share on other sites

Hasa

 

Boa tarde

 

Vc que usa o ACBR, pode utilizar este comando, para este caso que vc não está confiando na  Fun~ção da ferramenta.

NFe.FileExists(cNomeArq)

 

Verifica se o arquivo passado através do parâmetro cNomeArq existe na máquina em que o ACBrNFeMonitor está instalado.

 

Útil para quem utiliza comunicação via Sockets e deseja verificar a existência de um arquivo na máquina que está instalado o ACBrNFeMonitor sem precisar mapear a unidade de rede.

 

Parâmetro:

 

cNomeArq - Nome do Arquivo

 

Exemplo:

 

NFe.FileExists("NFe01.xml")

 

[]s,

Link to comment
Share on other sites

Hummm, obrigado mas... ainda não é isso, na verdade preciso saber que o arquivo de retorno do acbr já está na pasta assim que o acbr libera, pois o sistema fica bobolhando e 45 segundos depois ele percebe que o arquivo está lá a "HORAS".

HASA

Link to comment
Share on other sites

Very good giovany.

#Include "FiveWin.ch"
	Function Main()
	   Ver_Txt()
	Return Nil
	FUNCTION Ver_Txt()
	   While PathFileExists( "C:\TESTE\LICENCA.TXT" ) = 0  // se nao existir
	      SYSREFRESH()
	      SysWait(.3)
	      IF File( "C:\TESTE\LICENCA.TXT" )
	         // nada a fazer
	      ELSE
	         ? "Nao Achou"
	         EXIT
	      ENDIF
	   EndDo
	RETURN NIL
	DLL32 FUNCTION PathFileExists(cPathFileName AS STRING) AS LONG PASCAL ;
      FROM "PathFileExistsA" LIB "shlwapi.dll"


 

Link to comment
Share on other sites

Eu acho que o melhor não é ver se o arquivo esta na pasta, logo porque o sistema windows pode demorar um pouquinho para disponibilizar o arquivo em lista.

Vai direto no assunto, Acesse o arquivo diretamente e ja verifique se o acbr liberou ele.

Local nHandleFile, lOpenFile := .F., nQtaTentativas := 0

DO WHILE .T.
  
  nHandleFile := Fopen("C:\PASTA\ARQUIVO.TXT",16) //FO_EXCLUSIVE 
  
  If nHandleFile == -1
    nQtaTentativas ++
    hb_idleSleep( 0.2 )
    SysRefresh()
  else
   lOpenFile := .T.
   Exit
  EndIf
  
  If nQtaTentativas > 50 // 50 x .2 = 10 Segundos
    Exit
  EndIf

ENDDO

IF !lOpenFile
  ? "ERRO"
ELSE
  fClose(nHandleFile) // fecha o arquivo se quiser
ENDIF

 

Link to comment
Share on other sites

Pessoal,

 

Tenho uma dúvida e uma sugestão.

 

Sugestão:

Estive lendo este artigo (Vide link abaixo) e me parece uma situação muito boa para ganhar tempo de I/O. Antes a gente usava discos virtuais para gravação de pequenos arquivos, como são os casos  dos arquivos TXT de envio e retorno do ACBR, sendo que o de  envio é eliminando automaticamente, liberando espaço e o de retorno com tratamento pelo usuário pelo sistema.

Com isso, acredito que o ganho do processo de I/O, seja substancial, tendo em vista o arquivo estar sendo gravado em mémória.

https://www.tecmundo.com.br/windows-7/3210-dicas-do-windows-7-adicione-um-novo-disco-virtual-ao-computador.htm

 

Dúvida:

Essa DLL "shlwapi".

É de origem do windows?

A sua chamada pode ser feito em qualquer ferramenta?

O pq da minha questão. Tentei reproduzir trecho do post do Giovany, e não compila com o Xharbour por falta da função.

Syntax error: "syntax error at 'FUNCTION'"

[]s,

 

 

 

 

 

 

Link to comment
Share on other sites

  • 2 weeks later...

Essa função ajuda o usuário a ver que o sistema está trabalhando, esperando o arquivo ser disponibilizado.

Execute assim:

cFile := "arquivo a ser encontrado"

MsgWait1( "Aguarde o retorno do arquvo"+cFile, "Aguarde o retorno", 30, .F., {||File( cFile )} )

*******************************************************************************************
Function MsgWait1( cCaption, cTitle, nSeconds, lBot, bAction ) // MsgWait com "botão" de sair e "função" -> Exemplo: MsgWait1("cCaption", "cTitle", 5, .T., {||File("xxx.txt")} ) // o code block deve retornar (.T.)
*******************************************************************************************
   LOCAL oDlg, oProg1, oSay, oBtn, bOk, nInicio:=0
   cCaption := iif(ValType(cCaption)#"C", "Por favor, aguarde...",                   cCaption) // Mensagem para a janela
   cTitle   := iif(ValType(cTitle  )#"C", "(OASyS) Mensagem com espera programada.", cTitle  ) // Título para a janela
   nSeconds := iif(ValType(nSeconds)#"N", 5,                                         nSeconds) // Quantos segundos a janela ficará aberta
   lBot     := iif(ValType(lBot    )#"L", .F.,                                       lBot    ) // O Botão de Fechar será liberado? Se informado um Code Block será será oculto.
   bAction  := iif(ValType(bAction )#"B", "",                                        bAction ) // Code Block a ser executado. Exemplos: {|| Funcao() } ou {|| File("ent.txt") }   // A ação deve sempre retornar (.T.) no fim da execução
   PRIVATE n       := 0
   PRIVATE lBtn    := .F.
   PRIVATE lAction := ValType(bAction)="B"
   PRIVATE lRet    := iif(lAction, .F., .T.)
   DEFINE DIALOG oDlg SIZE 400,300 COLOR CLR_BLUE,CLR_HGRAY FONT oFontGet TITLE cTitle STYLE DS_MODALFRAME PIXEL
   @ 001,001 GROUP TO 109,199 FONT oFontSay TRANSPARENT PIXEL
   @ 110,001 GROUP TO 138,199 FONT oFontSay TRANSPARENT PIXEL
   @ 120,008 METER oProg1 VAR nInicio TOTAL nSeconds NOPERCENTAGE SIZE 145,011 PIXEL
   @ 120,159 BUTTON oBtn PROMPT "&Fechar" SIZE 35,12.5 ACTION (lBtn:=.T., n:=nSeconds) WHEN lBot PIXEL CANCEL
   @ 010,008 SAY oSay PROMPT cCaption SIZE 189,092 COLOR CLR_RED,CLR_HGRAY PIXEL
   oBtn:cToolTip:="Atenção: Se você fechar essa tela eu não vou conseguir executar a tarefa e algo pode sair errado."
   ACTIVATE DIALOG oDlg CENTER ON INIT oDlg:bStart:={|| Increase(oDlg, oProg1, nSeconds, bAction) }
Return( lRet )
Static Function Increase(oDlg, oProg1, nSeconds, bAction)
   oDlg:Refresh()
   For n=0 To nSeconds
      oProg1:Set( n )
      oProg1:cText := "Essa tela fechará em "+Alltrim(Str(nSeconds - n))+" segundos."
      if lAction                 // Se houver um code block a ser executado:
         if      Eval( bAction ) // - Verifica se a tarefa foi executada.
            lRet := .T.
            Exit
         elseif  n=nSeconds      // - Recomeça a contagem caso não tenha executado a tarefa ainda..
            if lBtn .AND. !MsgYesNo("Eu ainda não consegui terminar a tarefa que fui programado para executar, devo continuar até a conclusão?","(OASyS) Estou tentando executar uma tarefa importante.")
               Exit
            endif
            lBtn := .F.
            n    := 0
            oProg1:Set( n )
            oProg1:cText := "Essa tela fechará em "+Alltrim(Str(nSeconds))+" segundos."
            SysRefresh()
         endif
      endif
      WaitSeconds( 1 )
   Next
   oDlg:End()
Return nil

 

Link to comment
Share on other sites

Oscar, esse baguy() não espera nada. Desliga o dialogo de imediato. Reveja.

#include "FiveWin.ch"
	Function Main()
	   LOCAL cFile
	   cFile := "C:\TESTE\TESTE.TXT"
	   MsgWait1( "Aguarde o retorno do arquvo"+cFile, "Aguarde o retorno", 30, .F., {||File( cFile )} )
	Return nil
	*******************************************************************************************
Function MsgWait1( cCaption, cTitle, nSeconds, lBot, bAction ) // MsgWait com "botão" de sair e "função" -> Exemplo: MsgWait1("cCaption", "cTitle", 5, .T., {||File("xxx.txt")} ) // o code block deve retornar (.T.)
*******************************************************************************************
   LOCAL oDlg, oProg1, oSay, oBtn, bOk, nInicio:=0, oFontGet, oFontSay
	   cCaption := iif(ValType(cCaption)#"C", "Por favor, aguarde...",                   cCaption) // Mensagem para a janela
   cTitle   := iif(ValType(cTitle  )#"C", "(OASyS) Mensagem com espera programada.", cTitle  ) // Título para a janela
   nSeconds := iif(ValType(nSeconds)#"N", 5,                                         nSeconds) // Quantos segundos a janela ficará aberta
   lBot     := iif(ValType(lBot    )#"L", .F.,                                       lBot    ) // O Botão de Fechar será liberado? Se informado um Code Block será será oculto.
   bAction  := iif(ValType(bAction )#"B", "",                                        bAction ) // Code Block a ser executado. Exemplos: {|| Funcao() } ou {|| File("ent.txt") }   // A ação deve sempre retornar (.T.) no fim da execução
	   PRIVATE n       := 0
   PRIVATE lBtn    := .F.
   PRIVATE lAction := ValType(bAction)="B"
   PRIVATE lRet    := iif(lAction, .F., .T.)
	   DEFINE FONT oFontGet NAME "Ms Sans Serif" SIZE 00, -14 BOLD
   DEFINE FONT oFontSay NAME "Ms Sans Serif" SIZE 00, -12 BOLD
	   DEFINE DIALOG oDlg SIZE 400,300 COLOR CLR_BLUE,CLR_HGRAY FONT oFontGet TITLE cTitle STYLE DS_MODALFRAME PIXEL
	   @ 001,001 GROUP TO 109,199 FONT oFontSay TRANSPARENT PIXEL
	   @ 110,001 GROUP TO 138,199 FONT oFontSay TRANSPARENT PIXEL
	   @ 120,008 METER oProg1 VAR nInicio TOTAL nSeconds NOPERCENTAGE SIZE 145,011 PIXEL
	   @ 120,159 BUTTON oBtn PROMPT "&Fechar" SIZE 35,12.5 ACTION (lBtn:=.T., n:=nSeconds) WHEN lBot PIXEL CANCEL
	   @ 010,008 SAY oSay PROMPT cCaption SIZE 189,092 COLOR CLR_RED,CLR_HGRAY PIXEL
	   oBtn:cToolTip:="Atenção: Se você fechar essa tela eu não vou conseguir executar a tarefa e algo pode sair errado."
	   ACTIVATE DIALOG oDlg CENTER ON INIT oDlg:bStart:={|| Increase(oDlg, oProg1, nSeconds, bAction) }
	   oFontGet:End()
   oFontSay:End()
	Return( lRet )
	Static Function Increase(oDlg, oProg1, nSeconds, bAction)
	   oDlg:Refresh()
	   For n=0 To nSeconds
      oProg1:Set( n )
      oProg1:cText := "Essa tela fechará em "+Alltrim(Str(nSeconds - n))+" segundos."
      if lAction                 // Se houver um code block a ser executado:
         if      Eval( bAction ) // - Verifica se a tarefa foi executada.
            lRet := .T.
            Exit
         elseif  n=nSeconds      // - Recomeça a contagem caso não tenha executado a tarefa ainda..
            if lBtn .AND. !MsgYesNo("Eu ainda não consegui terminar a tarefa que fui programado para executar, devo continuar até a conclusão?","(OASyS) Estou tentando executar uma tarefa importante.")
               Exit
            endif
            lBtn := .F.
            n    := 0
            oProg1:Set( n )
            oProg1:cText := "Essa tela fechará em "+Alltrim(Str(nSeconds))+" segundos."
            SysRefresh()
         endif
      endif
      WaitSeconds( 1 )
   Next
	   oDlg:End()  // desliga direto em nao espera.
	Return nil


Link to comment
Share on other sites

Dei uma melhorada na função.

Execute assim para permitir que o usuário abandone a função caso não houver retorno do arquivo:

MsgWait1( "Aguarde o retorno do arquvo"+cFile, "Aguarde o retorno", 30, .T., {||File( cFile )} )

Se o usuário não puder cancelar e deve esperar até o arquivo aparecer na pasta, então faça assim:

MsgWait1( "Aguarde o retorno do arquvo"+cFile, "Aguarde o retorno", 30, .F., {||File( cFile )} )

A diferença está no quarto parâmetro .T. ou .F.

O legal dessa função é que mostra para o usuário que o sistema não está travado. É o que eu queria fazer com o MSGRUN()

Confira.

*******************************************************************************************
Function MsgWait1( cCaption, cTitle, nSeconds, lBot, bAction ) // MsgWait com "botão" de sair e "função" -> Exemplo: MsgWait1("cCaption", "cTitle", 5, .T., {||File("xxx.txt")} ) // o code block deve retornar (.T.)
*******************************************************************************************
   LOCAL oDlg, oProg1, oSay, oBtn, bOk, nInicio:=0
   cCaption := iif(ValType(cCaption)#"C", "Por favor, aguarde...",                   cCaption) // Mensagem para a janela
   cTitle   := iif(ValType(cTitle  )#"C", "(OASyS) Mensagem com espera programada.", cTitle  ) // Título para a janela
   nSeconds := iif(ValType(nSeconds)#"N", 5,                                         nSeconds) // Quantos segundos a janela ficará aberta
   lBot     := iif(ValType(lBot    )#"L", .F.,                                       lBot    ) // O Botão de Fechar será liberado? Se informado um Code Block será será oculto.
   bAction  := iif(ValType(bAction )#"B", "",                                        bAction ) // Code Block a ser executado. Exemplos: {|| Funcao() } ou {|| File("ent.txt") }   // A ação deve sempre retornar (.T.) no fim da execução
   PRIVATE n       := 0
   PRIVATE lBtn    := .F.
   PRIVATE lAction := ValType(bAction)="B"
   PRIVATE lRet    := iif(lAction, .F., .T.)
   DEFINE DIALOG oDlg SIZE 400,300 COLOR CLR_BLUE,CLR_HGRAY FONT oFontGet TITLE cTitle STYLE DS_MODALFRAME PIXEL
   @ 001,001 GROUP TO 109,199 FONT oFontSay TRANSPARENT PIXEL
   @ 110,001 GROUP TO 138,199 FONT oFontSay TRANSPARENT PIXEL
   @ 120,008 METER oProg1 VAR nInicio TOTAL nSeconds NOPERCENTAGE SIZE 145,011 PIXEL
   @ 120,159 BUTTON oBtn PROMPT "&Fechar" SIZE 35,12.5 ACTION lBtn:=.T. WHEN lBot PIXEL CANCEL
   @ 010,008 SAY oSay PROMPT cCaption SIZE 189,092 COLOR CLR_RED,CLR_HGRAY PIXEL
   oBtn:cToolTip:="Atenção: Se você fechar essa tela eu não vou conseguir executar a tarefa e algo pode sair errado."
   ACTIVATE DIALOG oDlg CENTER ON INIT oDlg:bStart:={|| Increase(oDlg, oProg1, nSeconds, bAction) }
Return( lRet )
Static Function Increase(oDlg, oProg1, nSeconds, bAction)
   oDlg:Refresh()
   oProg1:Set(0)
   oProg1:cText := "Essa tela fechará em "+Alltrim(Str(nSeconds))+" segundos."
   SysRefresh()
   For n=0 To nSeconds
      oProg1:Set( n )
      oProg1:cText := "Essa tela fechará em "+Alltrim(Str(nSeconds - n))+" segundos."
      if lAction                     // Se houver um code block a ser executado:
         if     Eval( bAction )      // - Verifica se a tarefa foi executada.
            lRet := .T.
            Exit
         elseif lBtn .OR. n=nSeconds // - Recomeça a contagem caso não tenha executado a tarefa ainda..
            if lBtn .AND. !MsgYesNo("Eu ainda não consegui terminar a tarefa que fui programado para executar, devo continuar até a conclusão?","(OASyS) Estou tentando executar uma tarefa importante.")
               Exit
            endif
            lBtn := .F.
            n    := 0
            oProg1:Set( n )
            oProg1:cText := "Essa tela fechará em "+Alltrim(Str(nSeconds))+" segundos."
         endif
      endif
      if lBtn
         Exit
      endif
      WaitSeconds( 1 )
      SysRefresh()
   Next
   oDlg:End()
Return nil

 

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...