× Linguagem de Programação ADVPL

Perguntas Erro 516 ao apagar ou renomear um arquivo .txt

Mais
10 anos 4 meses atrás #23812 por marceloc
Boa Tarde,

Estou com a seguinte situação.
Abro um arquivo txt e importo os dados para o protheus com rotina automático (especificamente apontamento de produção - módulo estoque).
Fecho o arquivo, mas necessito apagar o mesmo, mas ao tentar apagar com FErase apresenta o erro 516(The process cannot access the file because it is being used by another process.).
Fecho o arquivo com fClose(nHandle) e não da certo.

Já não sei mais o que fazer, alguém ja passou por isso?

Obrigado!

Por favor Acessar ou Registrar para participar da conversa.

Mais
10 anos 3 meses atrás #23822 por kanaamlrr
Tente utilizar o FOpen(nHandle,0)
Dessa forma você abre ele como somente leitura e não bloqueia o arquivo.
Verifique também que não tem nenhuma outra rotina travando esse arquivo.

Caso não funcione, tente mudar para a linha do FT_FUse, quando você terminar de processar o arquivo, utilize o comando FT_FUse() que ele irá liberar o arquivo, ai você pode dar um FErase() sem problemas...

Abraço!

Por favor Acessar ou Registrar para participar da conversa.

Mais
10 anos 3 meses atrás #23855 por marceloc
Bom dia,

Kanaãm, não deu certo. Fiz os passos que você informou e nada.

Segue trecho do fonte para quem quiser ver.

Abraço,

Local nHandle
Local aDosagem := {}
Local aDadosOP := {}
Local aFiles := {}
Local nX
Local aSD4 := {}
Local cDosagem := ""

aFiles := Directory("D:\temp\*.txt", "D")

For nX := 1 to Len( aFiles )
If SubStr(aFiles[nX,1],1,2) == "OP"
MsgStop(aFiles[nX,1])
cFOpen := "D:\Temp\" + aFiles[nX,1]
EndIf
Next nX

FT_FUse(cFOpen)
FT_FGoTop()
While !FT_FEof()
cLinha := FT_FReadln()

If SubStr(cLinha,1,7) == "DOSAGEM"
AADD(aDosagem,{SEPARA(cLinha,";",.T.)})
cDosagem += SubStr(cLinha,21,7)
ElseIf SubStr(cLinha,1,2) == "OP"
aDadosOP := SEPARA(cLinha,";",.T.)
EndIf

FT_FSkip()
EndDo

//Fecha o Arquivo TXT
FT_FUse()

cQuery := " SELECT D4_COD, D4_OP FROM "+ RetSqlName("SD4") +" SD4 "
cQuery += " WHERE SD4.D_E_L_E_T_ != '*' "
cQuery += " AND D4_FILIAL = '"+ xFilial("SD4") +"' AND D4_OP = '"+ aDadosOp[2] +"' "
If Select("QRYSD4") <> 0
QRYSD4->(dbCloseArea())
EndIf
dbUseArea (.T., "TOPCONN", TCGenQry(,,cQuery),"QRYSD4",.T.,.T.)

While QRYSD4->(!EOF())
aadd(aSD4,{Alltrim(QRYSD4->D4_COD),Alltrim(QRYSD4->D4_OP)})
QRYSD4->(dbSkip())
EndDo

dbSelectArea("SD4")
SD4->(dbSetOrder(2)) //D4_FILIAL + D4_OP + D4_COD + D4_LOCAL
dbSelectArea("SB2")
SB2->(dbSetOrder(1)) //B2_FILIAL + B2_COD + B2_LOCAL
dbSelectArea("SB1")
SB1->(dbSetOrder(1)) //B1_FILIAL + B1_COD

For i := 1 To Len(aSD4)
If SB1->(dbSeek(xFilial("SB1") + Padr(aSD4[i,1],TamSx3("B1_COD")[1])))
cArmazem := SB1->B1_LOCPAD
EndIf
If !aSD4[i,1] $ cDosagem
dbSelectArea("SD4")
SD4->(dbSelectArea(2)) //D4_FILIAL + D4_OP + D4_COD + D4_LOCAL
If SD4->(dbSeek(xFilial("SD4") + Padr(aSD4[i,2],TamSx3("D4_OP")[1]) + Padr(aSD4[i,1],TamSx3("D4_COD")[1]) + cArmazem ))
//Apaga o resitro que não existe na SD4
RecLock("SD4",.F.)
dbDelete()
SD4->(MsUnLock())
EndIf
EndIf
Next

For i := 1 To Len(aDosagem)
If SB1->(dbSeek(xFilial("SB1") + Padr(aDosagem[1][3],TamSx3("B1_COD")[1])))
cArmazem := SB1->B1_LOCPAD
EndIf
// Posiciona na tabela SD4 - Requisições Empenhadas
If SD4->(dbSeek(xFilial("SD4") + Padr(aDosagem[1][2],TamSx3("D4_OP")[1]) + Padr(aDosagem[1][3],TamSx3("D4_COD")[1]) + cArmazem ))
nDif := 0
nDif := Val(aDosagem[1][4]) - SD4->D4_QUANT
//Atualiza registro posicionado na SD4
RecLock("SD4",.F.)
SD4->D4_QTDEORI := Val(aDosagem[1][4])
SD4->D4_QUANT := Val(aDosagem[1][4])
SD4->(MsUnLock())
Else
nDif := 0
nDif := Val("-"+aDosagem[1][4])
//Inclui Registro novo na SD4
RecLock("SD4",.T.)
SD4->D4_FILIAL := xFilial("SD4")
SD4->D4_OP := aDosagem[i,1,2]
SD4->D4_COD := aDosagem[i,1,3]
SD4->D4_DATA := date()
SD4->D4_LOCAL := cArmazem
SD4->D4_QTDEORI := Val(aDosagem[1][4])
SD4->D4_QUANT := Val(aDosagem[1][4])
SD4->(MsUnLock())
EndIf
// Posiciona na tabela SB2 - Saldos Físico e Financeiro
If SB2->(dbSeek(xFilial("SB2") + Padr(aDosagem[1][3],TamSx3("B2_COD")[1]) + cArmazem ))
nResto := 0
nResto := SB2->B2_QEMP + (nDif)
//Atualiza registro na SB2
RecLock("SB2",.F.)
SB2->B2_QEMP := nResto
SB2->(MsUnLock())
EndIf
Next
//Rotina automatica para a inclusão do apontamento de produção
lRet := U_RMATA250(aDadosOP)

//Exclui o arquivo
If lRet
IF FERASE(cFOpen) == -1
MsgStop('Falha ao deletar o Arquivo ( FError'+str(FError(),4)+ ')')
Else
MsgStop('Arquivo deletado com sucesso.')
ENDIF
EndIf

Por favor Acessar ou Registrar para participar da conversa.

Mais
10 anos 3 meses atrás #23858 por kanaamlrr
Cara, faz um teste,
Tenta executar o comando de apagar o arquivo antes de executar o comando de abrir.
Se ele conseguir apagar, é seu fonte que está travando o arquivo, caso contrário, tem alguma falha de permissão de usuário ou sistema.

Por favor Acessar ou Registrar para participar da conversa.

Mais
10 anos 3 meses atrás #23861 por marceloc
Boa tarde,

Consegui apagar o arquivo antes de abri-lo.
Agora só falta descobrir o que pode estar travando o arquivo depois que o mesmo é aberto.

Mesmo eu colocando o FERASE() logo após fechar o arquivo com FT_FUSE(), não consigo apaga-lo.

Por favor Acessar ou Registrar para participar da conversa.

Mais
10 anos 3 meses atrás - 10 anos 3 meses atrás #23865 por admin
Veja se Funfa

nHandle := FT_FUse(cFOpen)
FT_FGoTop()
While !FT_FEof()
cLinha := FT_FReadln()

If SubStr(cLinha,1,7) == "DOSAGEM"
AADD(aDosagem,{SEPARA(cLinha,";",.T.)})
cDosagem += SubStr(cLinha,21,7)
ElseIf SubStr(cLinha,1,2) == "OP"
aDadosOP := SEPARA(cLinha,";",.T.)
EndIf

FT_FSkip()
EndDo

//Fecha o Arquivo TXT
fClose(nHandle) //FT_FUse() :blink: :blink: :blink:
Ultima edição: 10 anos 3 meses atrás por admin.

Por favor Acessar ou Registrar para participar da conversa.

Tempo para a criação da página:0.102 segundos
Joomla templates by a4joomla