MaximoAccess

Caro Usuário, não tire as suas duvidas nas Salas de Repositório, abra sempre um novo tópico relacionado, nas salas destinadas para o efeito, como Sala de Tabelas, Consultas, Formulários, Relatórios, Macros, Módulos e VBA.

Obrigado

Administração do MaximoAccess

Dicas Ms Access, Exemplos Ms Access, Codigos VBA Ms Access, SQL Ms Access

    Como saber se um arquivo está sendo utilizado?

    Compartilhe

    walisilva
    Novato
    Novato

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 34
    Registrado : 10/09/2015

    Como saber se um arquivo está sendo utilizado?

    Mensagem  walisilva em Qua 23 Dez 2015, 10:17

    Prezados,

    Vi que haviam alguns tópicos falando no assunto mas não encontrei algo mais claro e objetivo.

    No meu código eu crio um PDF, envio por e-mail e, em seguida, deleto. O problema é que as vezes vejo um erro de permissão negada, deduzo que o mesmo esteja ainda sendo utilizado pelo access por isso não consigo deletá-lo.

    Testei algumas formas e até agora nada com sucesso, portanto gostaria de saber se alguém aqui sabe uma função que eu possa saber se o arquivo ainda está aberto e aguardar (Do Whille... Loop).

    Agradeço a atenção de todos. Obrigado.


    .................................................................................
    --
    Walison Silva [Você precisa estar registrado e conectado para ver esta imagem.]

    Noobezinho
    Moderador
    Moderador

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 2490
    Registrado : 29/06/2012

    Re: Como saber se um arquivo está sendo utilizado?

    Mensagem  Noobezinho em Qua 23 Dez 2015, 10:55

    Walison



    Experimente isso:

    No final do código que envia para emails:

    Se existir uma msgbox que avisa que foi enviado, ótimo,

    se não existir crie uma.

    E depois deleta o arquivo.

    Se já existe a msgbox e mesmo assim, não da para deletar,

    antes da msgbox coloque uma Pausa no código.

    Comece com 2,3 minutos, e então vai testando e diminuindo

    o tempo de pausa, até chegar num tempo mínimo que de para

    deletar o arquivo.

    Espero que tenha feito me entender Wink

    [ ]'

    santa




    .................................................................................
    Noobezinho

    * A solução funcionou?  [Você precisa estar registrado e conectado para ver esta imagem.] 
    Agradeça e feche o tópico clicando no botão Resolvido
    Se não sabe como, veja [Você precisa estar registrado e conectado para ver este link.].

    Como anexar imagem no teu post do fórum : [Você precisa estar registrado e conectado para ver este link.]

    * Criar arquivos.zip com o Winrar - veja [Você precisa estar registrado e conectado para ver este link.].

    Atualmente estou verificando se quem está pedindo ajuda, ajudamos e não retornou.
    Se a pessoa em questão não deu retorno, não tentarei ajudar novamente .

    walisilva
    Novato
    Novato

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 34
    Registrado : 10/09/2015

    Re: Como saber se um arquivo está sendo utilizado?

    Mensagem  walisilva em Qua 23 Dez 2015, 11:27

    Noobezinho,

    Interessante, mas como não tenho msgbox seria complicado adicionar uma pausa de tempo, uma vez que meu objetivo é enviar cada vez mais rápido os emails...

    Outra coisa que eu observei é que, quando o access usa o arquivo, todas as verificações que eu encontrei mostra como se o arquivo estivesse aberto, testando abrindo o arquivo manualmente as verificações funcionam normalmente. É como se o access quando abre o arquivo e usa, depois de usar ele não diz que fechou, saca? Estranho isso. Vou postar aqui um código que achei pra melhor entender...

    Código:
    Function isfileopen(filename As String)

    Dim ifilenum As Long
    Dim ierr As Long

    On Error Resume Next
    ifilenum = FreeFile()
    Open filename For Input Lock Read As #ifilenum
    Close ifilenum
    ierr = err
    On Error GoTo 0

    Select Case ierr
    Case 0: isfileopen = False
    Case 70: isfileopen = True
    Case Else: Error ierr
    End Select

    End Function


    .................................................................................
    --
    Walison Silva [Você precisa estar registrado e conectado para ver esta imagem.]

    walisilva
    Novato
    Novato

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 34
    Registrado : 10/09/2015

    Re: Como saber se um arquivo está sendo utilizado?

    Mensagem  walisilva em Qua 23 Dez 2015, 11:31

    Obs: Erro 70 é erro de Permissão Negada, o que está me estressando há dias... Razz


    .................................................................................
    --
    Walison Silva [Você precisa estar registrado e conectado para ver esta imagem.]

    Noobezinho
    Moderador
    Moderador

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 2490
    Registrado : 29/06/2012

    Re: Como saber se um arquivo está sendo utilizado?

    Mensagem  Noobezinho em Qua 23 Dez 2015, 11:37

    Bem

    Já percebi que não tem a função pausa.

    Mas, gostaria que nos mostre o código

    que cria e envia cada PDF.

    Porque eu já fiz esse código para envio de boletos via e-mail.

    Detalhe, eu envio o PDF como anexo do e-mail.

    Aguardo...


    santa


    .................................................................................
    Noobezinho

    * A solução funcionou?  [Você precisa estar registrado e conectado para ver esta imagem.] 
    Agradeça e feche o tópico clicando no botão Resolvido
    Se não sabe como, veja [Você precisa estar registrado e conectado para ver este link.].

    Como anexar imagem no teu post do fórum : [Você precisa estar registrado e conectado para ver este link.]

    * Criar arquivos.zip com o Winrar - veja [Você precisa estar registrado e conectado para ver este link.].

    Atualmente estou verificando se quem está pedindo ajuda, ajudamos e não retornou.
    Se a pessoa em questão não deu retorno, não tentarei ajudar novamente .

    walisilva
    Novato
    Novato

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 34
    Registrado : 10/09/2015

    Re: Como saber se um arquivo está sendo utilizado?

    Mensagem  walisilva em Qua 23 Dez 2015, 11:50

    Função que transforma meu relatório em .SNP e em seguinda em .PDF com senha.

    Código:
    Public Function ConvertReportToPDF( _
    Optional RptName As String, _
    Optional SnapshotName As String, _
    Optional OutputPDFname As String, _
    Optional ShowSaveFileDialog As Boolean = False, _
    Optional StartPDFViewer As Boolean = True, _
    Optional CompressionLevel As Long, _
    Optional PasswordOwner As String, _
    Optional PasswordOpen As String, _
    Optional PasswordRestrictions As Long, _
    Optional PDFNoFontEmbedding As Long, _
    Optional pasta As String, Optional pArquivo As String, Optional strPathx As String) As Boolean

    Dim fso As FileSystemObject
    Dim fso2 As Object
    Set fso2 = CreateObject("scripting.filesystemobject")
    Dim S, a, b, file As String
    Dim blRet As Boolean
    Dim pausetime, start As Long
    Dim i As Integer

    'On Error Resume Next

    ' Let's see if the DynaPDF.DLL is available.
    blRet = LoadLib()

    If blRet = False Then
        ' Cannot find DynaPDF.dll or StrStorage.dll file
        Exit Function
    End If

    On Error GoTo ERR_CREATSNAP

    Dim strPath  As String
    Dim strPathandFileName  As String
    Dim strEMFUncompressed As String

    Dim sOutFile As String
    Dim lngRet As Long

    ' Init our string buffer
    strPath = Space(Pathlen)

    'Save the ReportName to a local var
    mReportName = RptName

    ' Let's kill any existing Temp SnapShot file
    If Len(mUncompressedSnapFile & vbNullString) > 0 Then
        Kill mUncompressedSnapFile
        mUncompressedSnapFile = ""
    End If

    ' If we have been passed the name of a Snapshot file then
    ' skip the Snapshot creation process below
    If Len(SnapshotName & vbNullString) = 0 Then
         
        ' Make sure we were passed a ReportName
        If Len(RptName & vbNullString) = 0 Then
            ' No valid parameters - FAIL AND EXIT!!
            ConvertReportToPDF = ""
            Exit Function
        End If
           
        ' Get the Systems Temp path
        ' Returns Length of path(num characters in path)
        lngRet = GetTempPath(Pathlen, strPath)
        ' Chop off NULLS and trailing "\"
        'strPath = Left(strPath, lngRet) & Chr(0)
        strPath = strPathx
       
        ' Now need a unique Filename
        ' locked from a previous aborted attemp.
        ' Needs more work!
        strPathandFileName = GetUniqueFilename(strPath, "SNP" & Chr(0), "snp")
       
        ' Export the selected Report to SnapShot format
        DoCmd.OutputTo acOutputReport, RptName, "SnapshotFormat(*.snp)", _
          strPathandFileName
        ' Make sure the process has time to complete
       
        file = strPathandFileName
            For i = 0 To 15
                If Len(Dir(file)) = 0 Then
                    i = i + 1
                    esperar (1)
                    DoEvents
                Else
                    Exit For
                End If
            Next

        If Len(Dir(file)) = 0 Then
        MsgBox "arquivo SNP encontrado. " & vbCrLf & file
        Exit Function
        End If
       
    Else
        strPathandFileName = SnapshotName
     
    End If

    ' Let's decompress into same filename but change type to ".tmp"
    'strEMFUncompressed = Mid(strPathandFileName, 1, Len(strPathandFileName) - 3)
    'strEMFUncompressed = strEMFUncompressed & "tmp"
    'Dim sPath As String * 512
    'lngRet = GetTempPath(512, sPath)

    strEMFUncompressed = GetUniqueFilename(strPath, "SNP", "tmp")

    lngRet = SetupDecompressOrCopyFile(strPathandFileName, strEMFUncompressed, 0&)

    If lngRet <> 0 Then
        'err.Raise vbObjectError + 525, "ConvertReportToPDF.SetupDecompressOrCopyFile", _
        "Não foi possível descompactar o arquivo do SnapShot" & vbCrLf & _
        "Selecione um relatório diferente para exportação"
    End If

    ' Set our uncompressed SnapShot file name var
    mUncompressedSnapFile = strEMFUncompressed

    ' Remember to Cleanup our Temp SnapShot File if we were NOT passed the
    ' Snapshot file as the optional param
    If Len(SnapshotName & vbNullString) = 0 Then
        Kill strPathandFileName
    End If


    ' Do we name output file the same as the input file name
    ' and simply change the file extension to .PDF or
    ' do we show the File Save Dialog
    If ShowSaveFileDialog = False Then

        ' let's decompress into same filename but change type to ".tmp"
        ' But first let's see if we were passed an output PDF file name
        If Len(OutputPDFname & vbNullString) = 0 Then
            sOutFile = Mid(strPathandFileName, 1, Len(strPathandFileName) - 3)
            sOutFile = sOutFile & "PDF"
        Else
            sOutFile = OutputPDFname
        End If

    Else
        ' Call File Save Dialog
        sOutFile = fFileDialog()
        If Len(sOutFile & vbNullString) = 0 Then
            Exit Function
        End If

    End If

    ' Call our function in the StrStorage DLL
    ' Note the Compression and Password params are not hooked up yet.

    blRet = ConvertUncompressedSnapshot(mUncompressedSnapFile, sOutFile, _
    CompressionLevel, PasswordOwner, PasswordOpen, PasswordRestrictions, PDFNoFontEmbedding)

        file = sOutFile
            For i = 0 To 15
                If Len(Dir(file)) = 0 Then
                    i = i + 1
                    esperar (1)
                    DoEvents
                Else
                    Exit For
                End If
            Next

        If Len(Dir(file)) = 0 Then
        MsgBox "arquivo pdf não encontrado. " & vbCrLf & file
        Exit Function
        End If

    a = CurrentDBDir & "temp\pdftk.exe " & pasta & "\" & pArquivo & ".pdf output " & pasta & "\xxxx" & Right(pArquivo, 7) & ".pdf owner_pw foopass user_pw " & Left(pArquivo, 4) & " uncompress allow copycontents degradedprinting printing"

    ShellWait (a)

        file = pasta & "\xxxx" & Right(pArquivo, 7) & ".pdf"
            For i = 0 To 15
                If Len(Dir(file)) = 0 Then
                    i = i + 1
                    esperar (1)
                    DoEvents
                Else
                    Exit For
                End If
            Next

        If Len(file) = 0 Then
        MsgBox "arquivo pdf não encontrado. " & vbCrLf & file
        Exit Function
        End If

    Kill pasta & "\" & pArquivo & ".pdf"

    If blRet = False Then
    err.Raise vbObjectError + 526, "ConvertReportToPDF.ConvertUncompressedSnaphot", _
        "Arquivo SnapShot danificado" & vbCrLf & _
        "Por favor selecione um relatório diferente para exportação"
    End If

    ' Do we open new PDF in registered PDF viewer on this system?
    If StartPDFViewer = True Then
     ShellExecuteA Application.hWndAccessApp, "open", sOutFile, vbNullString, vbNullString, 1
    End If

    ' Success
    ConvertReportToPDF = True


    EXIT_CREATESNAP:

    ' Let's kill any existing Temp SnapShot file
    'If Len(mUncompressedSnapFile & vbNullString) > 0 Then
        On Error Resume Next
      Kill mUncompressedSnapFile
        mUncompressedSnapFile = ""
    'End If

    ' If we aready loaded then free the library
    If hLibStrStorage <> 0 Then
        hLibStrStorage = FreeLibrary(hLibStrStorage)
    End If

    If hLibDynaPDF <> 0 Then
        hLibDynaPDF = FreeLibrary(hLibDynaPDF)
    End If

    Exit Function

    ERR_CREATSNAP:
    MsgBox err.Description, vbOKOnly, err.Source & ":" & err.Number
    mUncompressedSnapFile = ""
    ConvertReportToPDF = False
    Resume EXIT_CREATESNAP

    End Function

    Parte da função que envia o PDF gerado:

    Código:
    Set oMensagem = CreateObject("CDO.Message")
            Set oConfiguração = CreateObject("CDO.Configuration")
                oConfiguração.load -1 'Padrões CDO
                Set vFields = oConfiguração.Fields
                With vFields
                    .Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
                    .Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "servidor.smtp"
                    .Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25
                    .Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = -1
                    .Item("http://schemas.microsoft.com/cdo/configuration/sendusername") = "usuario"
                    .Item("http://schemas.microsoft.com/cdo/configuration/sendpassword") = "senha"
                    .Update
                End With
            With oMensagem
                Set .Configuration = oConfiguração
                .To = Replace(rsMalaEnvios.Fields("email"), " ", "")
                .CC = "" 'com cópia
                .BCC = "" 'com cópia oculta
                .FROM = "meu nome <" & rsLote.Fields("emailde") & ">"
                .Subject = Nz(ass, "meu assunto")
                .TextBody = ""
                .HtmlBody = Replace(Replace(msg, "[cliente]", rsMalaEnvios.Fields("Sacado")), "[cpf2]", "XXXX" & Right(rsMalaEnvios.Fields("cpf devedor"), 7))
               
                    file = CurrentDBDir & "TEMP_" & Left(CurrentProject.Name, Len(CurrentProject.Name) - 4) & "\XXXX" & Right(rsMalaEnvios.Fields("cpf devedor"), 7) & ".pdf"
           
                    For i = 0 To 15
                        If Len(Dir(file)) = 0 Then
                            i = i + 1
                            esperar (1)
                            DoEvents
                        Else
                            Exit For
                        End If
                    Next
           
                    If Len(Dir(file)) = 0 Then
                        GoTo e
                    End If
               
                .AddAttachment file
                .Send
            End With
           
           
            'desctruir pdf enviado
            tstarq = CurrentDBDir & "TEMP_" & Left(CurrentProject.Name, Len(CurrentProject.Name) - 4) & "\xxxx" & Right(rsMalaEnvios.Fields("cpf devedor"), 7) & ".pdf"
           
            isfileopen ("" & tstarq)
           
                If tstarq <> "" Then
                    Kill tstarq
                End If


    .................................................................................
    --
    Walison Silva [Você precisa estar registrado e conectado para ver esta imagem.]

    Noobezinho
    Moderador
    Moderador

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 2490
    Registrado : 29/06/2012

    Re: Como saber se um arquivo está sendo utilizado?

    Mensagem  Noobezinho em Qua 23 Dez 2015, 13:11

    Walison

    Vi teu código rapidamente, depois vejo com mais calma, correria de fim de ano. Razz
    Percebi que usou duas variáveis para o mesmo caminho do pdf.(a unica diferença é o diretório
    que numa frase está /XXXX e na outra \xxxx (linhas em laranja).
    Se for a mesma coisa, o que acredito que seja, pode utilizar somente uma variável.
    Experimente com a Pausa , a linha em azul, quase no final do código.
    E fique tranquilo que isso não irá demorar teu código.

    Mais abaixo a função Pausa()



    Walison - veja o código clicando aqui:


    Set oMensagem = CreateObject("CDO.Message")
           Set oConfiguração = CreateObject("CDO.Configuration")
               oConfiguração.load -1 'Padrões CDO
               Set vFields = oConfiguração.Fields
               With vFields
                   .Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
                   .Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "servidor.smtp"
                   .Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25
                   .Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = -1
                   .Item("http://schemas.microsoft.com/cdo/configuration/sendusername") = "usuario"
                   .Item("http://schemas.microsoft.com/cdo/configuration/sendpassword") = "senha"
                   .Update
               End With
           With oMensagem
               Set .Configuration = oConfiguração
               .To = Replace(rsMalaEnvios.Fields("email"), " ", "")
               .CC = "" 'com cópia
               .BCC = "" 'com cópia oculta
               .FROM = "meu nome <" & rsLote.Fields("emailde") & ">"
               .Subject = Nz(ass, "meu assunto")
               .TextBody = ""
               .HtmlBody = Replace(Replace(msg, "[cliente]", rsMalaEnvios.Fields("Sacado")), "[cpf2]", "XXXX" & Right(rsMalaEnvios.Fields("cpf devedor"), 7))
               
                   file = CurrentDBDir & "TEMP_" & Left(CurrentProject.Name, Len(CurrentProject.Name) - 4) & "\XXXX" & Right(rsMalaEnvios.Fields("cpf devedor"), 7) & ".pdf"
           
                   For i = 0 To 15
                       If Len(Dir(file)) = 0 Then
                           i = i + 1
                           esperar (1)
                           DoEvents
                       Else
                           Exit For
                       End If
                   Next
           
                   If Len(Dir(file)) = 0 Then
                       GoTo e
                   End If
               
               .AddAttachment file
               .Send
           End With
           
           
           
           'desctruir pdf enviado
           tstarq = CurrentDBDir & "TEMP_" & Left(CurrentProject.Name, Len(CurrentProject.Name) - 4) & "\xxxx" & Right(rsMalaEnvios.Fields("cpf devedor"), 7) & ".pdf"
           
           isfileopen ("" & tstarq)
           Call Pausa 5
               If tstarq <> "" Then
                   Kill tstarq
               End If


    Código:

    Public Function Pausa(Nsec As Variant)
    'uso: Pausa 1  = 1 segundo
    On Error GoTo Err_Pausa

       Dim PausaTime As Variant, start As Variant

       PausaTime = Nsec
       start = Timer
       Do While Timer < start + PausaTime
       DoEvents
       Loop

    Exit_Pausa:
       Exit Function

    Err_Pausa:
       Dialog.Box err.Number & " - " & err.Description, vbCritical, "Pausa()"
       Resume Exit_Pausa

    End Function


    santa


    .................................................................................
    Noobezinho

    * A solução funcionou?  [Você precisa estar registrado e conectado para ver esta imagem.] 
    Agradeça e feche o tópico clicando no botão Resolvido
    Se não sabe como, veja [Você precisa estar registrado e conectado para ver este link.].

    Como anexar imagem no teu post do fórum : [Você precisa estar registrado e conectado para ver este link.]

    * Criar arquivos.zip com o Winrar - veja [Você precisa estar registrado e conectado para ver este link.].

    Atualmente estou verificando se quem está pedindo ajuda, ajudamos e não retornou.
    Se a pessoa em questão não deu retorno, não tentarei ajudar novamente .

    walisilva
    Novato
    Novato

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 34
    Registrado : 10/09/2015

    Re: Como saber se um arquivo está sendo utilizado?

    Mensagem  walisilva em Qua 23 Dez 2015, 15:50

    Ótimo, vou estar essa pausa.

    Minha ideia seria, tratar esse erro. Quando der erro ai sim esperar e tentar de novo. Mas adicionar tempo ao meu codigo vai diminuir meu desempenho ao longo do dia.


    .................................................................................
    --
    Walison Silva [Você precisa estar registrado e conectado para ver esta imagem.]

    Noobezinho
    Moderador
    Moderador

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 2490
    Registrado : 29/06/2012

    Re: Como saber se um arquivo está sendo utilizado?

    Mensagem  Noobezinho em Qua 23 Dez 2015, 16:39

    Essa pausa é somente para esperar o Access terminar a operação.

    Ou seja, com ou sem pausa, terá que esperar o código terminar e liberar o arquivo,

    para então poder deleta-lo.

    Tentar tratar o erro não vai adiantar porque ele ainda não existe.

    O erro só acontece quando tenta deletar o arquivo antes do tempo.

    santa


    .................................................................................
    Noobezinho

    * A solução funcionou?  [Você precisa estar registrado e conectado para ver esta imagem.] 
    Agradeça e feche o tópico clicando no botão Resolvido
    Se não sabe como, veja [Você precisa estar registrado e conectado para ver este link.].

    Como anexar imagem no teu post do fórum : [Você precisa estar registrado e conectado para ver este link.]

    * Criar arquivos.zip com o Winrar - veja [Você precisa estar registrado e conectado para ver este link.].

    Atualmente estou verificando se quem está pedindo ajuda, ajudamos e não retornou.
    Se a pessoa em questão não deu retorno, não tentarei ajudar novamente .

    walisilva
    Novato
    Novato

    Respeito às Regras 100%

    Sexo : Masculino
    Localização : Brasil
    Mensagens : 34
    Registrado : 10/09/2015

    Re: Como saber se um arquivo está sendo utilizado?

    Mensagem  walisilva em Qua 23 Dez 2015, 17:22

    É isso que estou falando. Preciso saber como faço pra, antes de deletar, verificar se o arquivo existe (que existe mesmo) e se ele não está sendo utilizado. Caso ocorra de ele não existir ou estar sendo usado, geraria o erro mas, no tratamento eu aguardaria (while...loop) ele atender a minha necessidade.

    Porém, qualquer tratamento de erro que eu colocar (código do erro: 70) não consigo tratar.


    .................................................................................
    --
    Walison Silva [Você precisa estar registrado e conectado para ver esta imagem.]

      Data/hora atual: Seg 05 Dez 2016, 01:21