none
Mover arquivo após enviá-lo por email RRS feed

  • Pergunta

  • Boa tarde pessoal.

    Estou com a seguinte situação:

    Criei um código para monitorar uma pasta de xml's e ao ser gerada uma nova nota fiscal, esse xml é gravado nessa pasta monitorada. Então meu código vem e anexa esse xml e dispara o email automaticamente (o erp não faz isso de forma automática, então eu automatizei). Mover arquivos é tranquilo, assim como gerar o email e anexar. O meu problema está ao fazer essas 2 operações sequencialmente, pois ao anexar o arquivo, o mesmo fica preso na thread de envio de email e aí eu não consigo mover ele para a pasta de processados.

    Para facilitar o entendimento, estou colocando o código aqui:

    Sub LeXML()
            Dim semailDestino As String = ""
            Dim sNF As String = ""
            Dim sDestinatario As String = ""
            Dim sDataNF As String = ""
            Dim sCorpoEmail As String = ""
            Dim sTituloEmail As String = ""
            Dim sPDF As String = ""
            Dim sHost As String = "smtp_server", sPort As String = "587"
            Dim sEmail As String = "nfe@email.com.br"
            Dim sSenha As String = "senha"
            Dim sArrayXML As String()
            Dim sXMLAux As String = ""
            Dim sArrayPDF As String()
            Dim sPDFAux As String = ""
            tssSituacao.Text = "Executando"
            tssSituacao.ForeColor = Color.DarkGreen
            Dim sPasta As New DirectoryInfo(Me.txtPastaMonitorada.Text)
            If Not sPasta.Exists Then
                sPasta.Create()
            End If
            tssProgressBar.Value = 0
            tssProgressBar.Maximum = sPasta.GetFiles("*.xml").Count + 1
    
            For Each sfile As FileInfo In sPasta.GetFiles("*.xml")
                tssProgressBar.Value = tssProgressBar.Value + 1
                Dim Ds As New DataSet
                Ds.ReadXml(sfile.FullName)
                Dim bdsAux As New BindingSource
                bdsAux.DataSource = Ds
                bdsAux.DataMember = "dest"
                semailDestino = bdsAux.Current("email").ToString
                sDestinatario = bdsAux.Current("xNome").ToString & " - " & bdsAux.Current("CNPJ").ToString
                bdsAux.DataMember = "ide"
                sNF = bdsAux.Current("nNF").ToString
                sDataNF = bdsAux.Current("dhEmi").ToString
                sCorpoEmail = "Segue em anexo XML e Danfe da NF: " & sNF & " de " & sDataNF & " - destinado a: " & sDestinatario & vbCrLf & vbCrLf & "Obrigada" & vbCrLf & "Funcionária - Empresa"
                sTituloEmail = "DANFE e XML " & sNF
                lstHistorico.Items.Add(Now & " - Enviando email para " & sDestinatario & " - " & semailDestino & " NF:" & sNF & " de " & sDataNF)
                sPDF = sfile.DirectoryName & "\" & "DANFE_" & sfile.Name.Replace(".xml", ".pdf")
                sXMLAux = sXMLAux & "|" & sfile.FullName
                sPDFAux = sPDFAux & "|" & sPDF
                SmtpEmail(sHost, sPorta, sEmail, sSenha, semailDestino, sTituloEmail, sCorpoEmail, sfile.FullName, sPDF)
            Next
    
            'Aqui começa a parte onde quero mover o arquivo.
            
    		'nesse sleep eu tentei "esperar" o processo terminar e liberar o aruqivo, mas não surtiu muito efeito ou não esperei o suficiente...
            System.Threading.Thread.Sleep(300000) ' pausa por x minuto
    
            sArrayXML = sXMLAux.Split("|")
            sArrayPDF = sPDFAux.Split("|")
            Dim sAux As String = sPasta.FullName & "\PROCESSADOS"
            sPasta = Nothing
            For i = 1 To sArrayXML.Count
                Dim sFileXML As New FileInfo(sArrayXML(i))
                Dim sFilepdf As New FileInfo(sArrayPDF(i))
                Dim sPasta2 As New DirectoryInfo(sAux)
                If Not sPasta2.Exists Then
                    sPasta2.Create()
                End If
                sFileXML.MoveTo(sPasta2.FullName & "\PROCESSADO_" & sFileXML.Name)
                sFilepdf.MoveTo(sPasta2.FullName & "\PROCESSADO_" & sFilepdf.Name)
            Next
            'fim do trecho que tenta mover o arquivo.
    
            tssSituacao.Text = "Aguardando"
            tssSituacao.ForeColor = Color.Red
            tssProgressBar.Maximum = 100
            tssProgressBar.Value = 0
        End Sub

    E aqui eu mostro como eu envio o email, através de uma função async, pois foi o único jeito que consegui enviar um email através dos servidores da locaweb:

    Async Sub SmtpEmail(sHost As String, sPort As String, sEmail As String, sSenha As String, sDestinatario As String, sTituloEmail As String, sCorpoEmail As String, sXML As String, sPDF As String)
            Using smtp As New System.Net.Mail.SmtpClient()
                smtp.Host = sHost 
                smtp.Port = sPort
                smtp.EnableSsl = True
                smtp.UseDefaultCredentials = False
                smtp.Credentials = New System.Net.NetworkCredential(sEmail.ToString, sSenha.ToString)
    
                Using mail As New System.Net.Mail.MailMessage()
                    mail.From = New System.Net.Mail.MailAddress(sEmail)
                    mail.[To].Add(New System.Net.Mail.MailAddress(sDestinatario))
                    mail.Bcc.Add(New System.Net.Mail.MailAddress(sEmail))
                    mail.Subject = sTituloEmail
                    mail.Body = sCorpoEmail
                    mail.Attachments.Add(New System.Net.Mail.Attachment(sXML))
                    mail.Attachments.Add(New System.Net.Mail.Attachment(sPDF))
                    Await smtp.SendMailAsync(mail)
                    mail.Dispose() 'aqui eu tentei liberar os arquivos, mas não deu certo tb.
                End Using
                smtp.Dispose()
            End Using
        End Sub

    Será que alguém aqui consegue me ajudar com esse problema de processos travando arquivos?

    Att.

    Giovani

    terça-feira, 13 de junho de 2017 19:53

Respostas

  • Bom dia pessoal.

    Desculpem a demora em dar atenção ao tópico.

    Eu resolvi a situação mudando a forma de abordagem, onde eu movi primeiro o arquivo para a pasta e depois enviei por email.

    O problema que eu estava tendo era referente ao anexar o arquivo e enviar por email, após o envio, eu não conseguia mais mover o arquivo ou renomeá-lo. O erro que dava era que "uma outra thread está usando o arquivo". Eu estava tentando descobrir um jeito de após o envio do email, desbloquear o arquivo dessa thread. Mas não consegui, nem após o envio, usando o dispose no mail message.

    Enfim, o problema só foi resolvido ao mudar a abordagem. Mas seria interessante descobrir uma forma de desbloquear o arquivo após um envio de email para programações futuras.

    Obrigado.

    segunda-feira, 19 de junho de 2017 12:54

Todas as Respostas

  • Boa tarde, Giovani Rodrigues.

    Você conseguiu resolver o problema? Se ainda não, pode explicar um pouco melhor, para que possamos te ajudar?
    quarta-feira, 14 de junho de 2017 17:42
  • Ok mais qual o erro ? vc que mover so um file ou varios ? io.File.move(,)
    domingo, 18 de junho de 2017 17:14
  • Bom dia pessoal.

    Desculpem a demora em dar atenção ao tópico.

    Eu resolvi a situação mudando a forma de abordagem, onde eu movi primeiro o arquivo para a pasta e depois enviei por email.

    O problema que eu estava tendo era referente ao anexar o arquivo e enviar por email, após o envio, eu não conseguia mais mover o arquivo ou renomeá-lo. O erro que dava era que "uma outra thread está usando o arquivo". Eu estava tentando descobrir um jeito de após o envio do email, desbloquear o arquivo dessa thread. Mas não consegui, nem após o envio, usando o dispose no mail message.

    Enfim, o problema só foi resolvido ao mudar a abordagem. Mas seria interessante descobrir uma forma de desbloquear o arquivo após um envio de email para programações futuras.

    Obrigado.

    segunda-feira, 19 de junho de 2017 12:54
  • Ótimo Giovani Rodrigues ;)
    segunda-feira, 19 de junho de 2017 13:17