Página 1 de 1

comando File falhando para ver se arquivo existe

Enviado: 23 Nov 2016 13:41
por porter
olá pessoal, no comando abaixo, está acontecendo de não localizar o ATUALIZA.EXE, o arquivo está nesta pasta, mas não executa a rotina
porque não encontra o atualiza.exe, já aconteceu isso com alguem, existe um comando mais eficaz para verificar se o arquivo existe ?

If File("C:\ESTOQUE\ATUALIZA.EXE")
! del loja.old
! ren loja.exe *.old
! ren atualiza.exe loja.exe
MENSAGEM("Atualizado !")
endif

xHarbour, obrigado.

comando File falhando para ver se arquivo existe

Enviado: 23 Nov 2016 13:45
por janio
Ja tentou com hb_FileExists??

Nao sei se tem essa função no xHarbour...

comando File falhando para ver se arquivo existe

Enviado: 23 Nov 2016 14:48
por Jairo Maia
Ou porque o arquivo loja.exe está em execução.

comando File falhando para ver se arquivo existe

Enviado: 23 Nov 2016 15:02
por Kapiaba

Código: Selecionar todos

// Modificado por Joao Santos em: 23/11/2016 - kapiabafwh@gmail.com

#include "FiveWin.ch"  // retire a chamada ao Fivewin se modo console.
#Include "set.ch"

FUNCTION Main()

  LOCAL nArquivo, cArquivo := "TESTE.TXT", lCacheSyst := NIL

  nArquivo := FileExist( cArquivo, lCacheSyst )

  IF nArquivo  // .T.
     ? [Arquivo existe ], nArquivo
  ELSE // .F.
     ? [Arquiv nao existe ], nArquivo
  ENDIF

RETURN NIL

FUNCTION FileExist( cArquivo, lCacheSyst )

   * Auteur Badara Thiam - Ideia original.
   LOCAL nAttributs
   LOCAL nCount := 1
   LOCAL X
   LOCAL cSepare := ""

   IF "\" $ cArquivo

   ELSEIF !EMPTY( SET(_SET_DEFAULT) )

      * Recherche dans le répertoire par défaut de clipper (SET DEFAULT TO)
      cArquivo := TRIM(SET(_SET_DEFAULT)) + "\" + cArquivo

   ELSEIF !EMPTY( SET(_SET_PATH) )

      * Recherche dans le(s) répertoire(s) du path de clipper (SET PATH TO)
      nCount := LEN( SET(_SET_PATH) ) - LEN( STRTRAN(SET(_SET_PATH),",","") ) + 1

      IF nCount = 1

         nCount := LEN( SET(_SET_PATH) ) - LEN( STRTRAN(SET(_SET_PATH),";","") ) + 1

         IF nCount = 1

            cArquivo := TRIM(SET(_SET_PATH)) + "\" + cArquivo

         ELSE

            cSepare := ";"

         ENDIF

      ELSE

        cSepare := ","

      ENDIF

   ENDIF

   FOR X := 1 TO nCount

      IF nCount = 1

         * With Windows apps
         nAttributs := GetFileAttributes(cArquivo)

         * Or with Clipper DOS apps via Clipper Tools
         * nAttributs := FileAttr(cArquivo)

      ELSE

         * With Windows apps
         nAttributs := GetFileAttributes( ALLTRIM( TOKEN(SET(_SET_PATH), cSepare, nCount) ) ;
         + "\" + cArquivo)

         * Or with Clipper DOS apps via Clipper Tools
         * nAttributs := FileAttr( ALLTRIM( TOKEN(SET(_SET_PATH), cSepare, nCount) ) ;
         * + "\" + cArquivo)
  
      ENDIF

      IF ( nAttributs >= 0 .AND. ( nAttributs % 32 ) < IIF(EMPTY(lCacheSyst), 2, 8) )

         RETURN .T.

      ENDIF

   NEXT X

RETURN .F.

*******************
DLL32 FUNCTION GetFileAttributes( lpszSearchFile AS STRING ) AS DWORD ;
PASCAL FROM "GetFileAttributesA" LIB "KERNEL32.DLL"

// FIM DO PROGRAMA

comando File falhando para ver se arquivo existe

Enviado: 24 Nov 2016 14:36
por JoséQuintas
Pra otimizar a rede, o Windows economiza consultas.
Se esse arquivo não estava lá antes, a nova consulta vai dizer que não está.
Tem umas configurações no Windows pra evitar isso.
Não sei dizer quais são, mas fazem parte de uma função do Harbour que já configura tudo do Windows de uma vez.

Algo como o diretório ficar em cache, e não ser atualizado.

Nota: isso se o arquivo é "novo" na pasta.

comando File falhando para ver se arquivo existe

Enviado: 13 Dez 2016 22:09
por janio
Não tenho permissão de ESCRITA na pasta "c:\Windows"

Pq os comandos

hb_FileExists("c:\Windows\CriaSoft.ini")
e
File("c:\Windows\CriaSoft.ini")

sempre retornam VERDADEIRO mesmo que o arquivo NÃO EXISTA?

Os comandos acima SOMENTE retornam a INFORMAÇÃO CORRETA, se o arquivo de fato existe ou não, se eu EXECUTAR O SISTEMA COMO ADMINISTRADOR!

Alguma solução para isso?

comando File falhando para ver se arquivo existe

Enviado: 13 Dez 2016 22:16
por Pablo César
Oi Janio,

E se tentar com hb_FGetAttr(<cFileName>, @<nAttr>) -> lSuccess

Colocando como atributo: "S", "H" ou "R" ?

Melhor dito: talvez nem precise atributo algum...

Mas um pergunta Janio. O arquivo INI você pretende alterar lá no Windows ? ummm ai acho dificil pela questão de direitos e privilégios do usuário... agora se for só para saber, acho que tem jeito sim.

comando File falhando para ver se arquivo existe

Enviado: 13 Dez 2016 22:30
por janio
Preciso apenas saber se o arquivo existe!

Ocorre que SEM PRIVILEGIO DE ADMINISTRADOR, as funções SEMPRE retornam VERDADEIRO mesmo que o arquivo NAO EXISTA!

Janio

comando File falhando para ver se arquivo existe

Enviado: 13 Dez 2016 22:39
por Pablo César
Janio escreveu:Preciso apenas saber se o arquivo existe!
Tá bem... mas não se irrite (dizia o Chaves pro Kiko... Imagem) . Beleza, então...

Eu testei como "convidado" e deu certo com hb_FGetAttr(<cFileName>)

comando File falhando para ver se arquivo existe

Enviado: 14 Dez 2016 00:36
por janio
Calma aí, Pablo! kkk

A intenção eh verificar se o arquivo existe! Caso não exista, criá-lo! Mas como vou saber que éh necessário CRIAR o arquivo se toda vez a função mim retorna VERDADEIRO, mesmo que o arquivo NÃO EXISTA!?!?!?!

"Mas como vc vai escrever numa pasta que não tem permissão?". Bem, neste caso, eu penso em verificar se o arquivo existe. Se não existir, tentar criá-lo. Não conseguiu criá-lo? Mostra mensagem pedindo para executar o sistema como administrador.

Simples assim...

A função que vc indicou, ao que parece, eh apenas para MUDAR o atributo do arquivo! Mas ela esta retornando VERDADEIRO mesmo que o arquivo NAO EXISTA tbm kkk!

Janio

comando File falhando para ver se arquivo existe

Enviado: 14 Dez 2016 08:14
por Pablo César
janio escreveu:Calma aí, Pablo! kkk
Ahhh já vi que o seu ponto de exclamação é muito comum no seu hábito...
janio escreveu:ao que parece, eh apenas para MUDAR o atributo do arquivo!
Parece apenas MUDAR ? Não !

Releia ! rs
hb_FGetAttr(<cFileName>)
Screen38.png
Ou é o seu Harbour que tá bichado ou você testou...

Eu só quis te ajudar.

comando File falhando para ver se arquivo existe

Enviado: 14 Dez 2016 08:32
por dbdc5554
Porter:

If File("C:\ESTOQUE\ATUALIZA.EXE")
! del loja.old
! ren loja.exe *.old
! ren atualiza.exe loja.exe
MENSAGEM("Atualizado !")
endif

O problema pode ser NAO estar deletando o OLD Por isso NAo renomeia o exe.

acontece MUITO do OLD estar protegido ai nao se consegue deleta-lo.

faça assim Uso a ANOS...
* ATUALIZA€¶O do sfa.exe
xarq = [\dbdc\atualiza.exe]
if file(xarq)
for x_existe = 1 to 100
xarq = [\dbdc\sfa.]+strzero(x_existe,3)
erase &xarq
if file(xarq)
loop
endif
exit
next
rename \dbdc\sfa.exe to &xarq
rename \dbdc\atualiza.exe to \dbdc\sfa.exe

pmsg = [ATEN€¶O - Foi ATUALIZADO o Execut vel, Re-Inicie o Sistema Novamente, Obrigado]
ftempo()

quit

endif

comando File falhando para ver se arquivo existe

Enviado: 14 Dez 2016 20:55
por janio
Pablo,

Meu ambiente:
Windows 7 64 bits
logado com usuário administrador e
UAC no nível PADRÃO

Mesmo estando logado como administrador, para escrita na pasta Windows, preciso de permissão de 'administrador' para isso, conforme imagem anexa.

Pois bem, após repetir várias vezes todos os testes e com todas as funções (hb_FGetAttr, hb_FileExists e File)... o resultado foi sempre o mesmo: as funções retornam .T. mesmo que o arquivo não exista.

Não loguei como 'convidado'. Estou logado como administrador mesmo e acho que o que está diferenciando o meu ambiente do seu, é exatamente a questão do UAC... talvez aí esteja o xis da questão!

Jânio

PS: Gostaria que alguém testasse num ambiente semelhante e confirmasse ou não o problema.


[EDIT]

Desliguei o UAC, reiniciei o computador e as funções passaram a FUNCIONAR como o ESPERADO!

O xis da questão realmente eh o UAC que faz retornar informações falsas em pastas protegidas de escrita. O UAC impede a escrita e até mesmo a simples verificação se um arquivo existe na pasta. Inacreditável!

Como resolver essa questão?

comando File falhando para ver se arquivo existe

Enviado: 14 Dez 2016 22:59
por fladimir

comando File falhando para ver se arquivo existe

Enviado: 16 Jan 2017 17:45
por Pablo César
janio escreveu:Desliguei o UAC, reiniciei o computador e as funções passaram a FUNCIONAR como o ESPERADO!

O xis da questão realmente eh o UAC que faz retornar informações falsas em pastas protegidas de escrita. O UAC impede a escrita e até mesmo a simples verificação se um arquivo existe na pasta. Inacreditável!

Como resolver essa questão?
Janio, acho estranho esse comportamento que você menciona, farei uma pergunta que talvez pareça óbvia. Porque eu não tenho dificuldades na verificação de existência de arquivo seja interferido pelo UAC.

Desculpe mas sem querer menosprezar o seu procedimento. Verificou se o path está correto ? Pois eu já me deparei com várias situações em que faltava uma barra invertida...

De todas formas, tenho para mostrar 4 exemplo de elevação de privilégios usando o UAC: http://www.hmgforum.com/viewtopic.php?f=15&t=5072

Abaixe exemplos e veja se pode servir. Porque essa questão de desativar o UAC, é mais kamikaze que o uso de tais funções para elevação quando requerida.