Файл используется почтой .NET - PullRequest
0 голосов
/ 07 сентября 2018

Я написал простую программу, написанную для сбора файлов, отправки файлов, а затем удаления указанных файлов. Я отправляю их по электронной почте, используя System.Net.Mail

If Label6.Text = "" Then
        mail.Attachments.Add(New Attachment(zipPath))
    End If
    'Enables SSL, if required
    ssl = Provider.ssl
    If skipAhead = True Then
        ssl = True
    End If
    If ssl = True Then
        SmtpServer.EnableSsl = True
    End If
    'Sends the email
    SmtpServer.Send(mail)
    'Allows the user to either keep testing, or quit.
    If skipAhead = True Then
        My.Computer.FileSystem.DeleteFile(unalteredPath)
        My.Computer.FileSystem.DeleteFile(unalteredPath1)
        My.Computer.FileSystem.DeleteFile(zipPath)
    Else
        Dim keepOpen As Integer = MsgBox("The Email was sent. You can keep testing if you would like to. Press ok to close, and cancel to keep testing", MsgBoxStyle.OkCancel)
        If keepOpen = 1 Then
            Close()
        End If
    End If

Как видно из строки 2, вложение добавляется в электронное письмо, и я не пытаюсь удалить вложение до тех пор, пока письмо не будет отправлено, однако при выполнении кода выдается ошибка, что файл используется другим процессом.

Мне также интересно, может ли это задержаться на самом процессе создания .zip. Вот код, который делает это:

Public Sub Zipping()
    'Copies files to the folder where they will be zipped from
    My.Computer.FileSystem.CopyFile(unalteredPath, outputs & "\ExIpOutput.txt")
    My.Computer.FileSystem.CopyFile(unalteredPath1, outputs & "\IpConfig.txt")
    'Deletes the old output files
    My.Computer.FileSystem.DeleteFile(unalteredPath)
    My.Computer.FileSystem.DeleteFile(unalteredPath1)
    'Starts the zip Sub
    ZipFile.CreateFromDirectory(outputs, zipPath, CompressionLevel.Fastest, True)
    My.Computer.FileSystem.DeleteDirectory(outputs, FileIO.DeleteDirectoryOption.DeleteAllContents)
End Sub

Вот подпункт CreateFromDirectory:

Public Shared Sub CreateFromDirectory(sourceDirectoryName As String, destinationArchiveFileName As String, compressionLevel As Compression.CompressionLevel, includeBaseDirectory As Boolean)
End Sub

Есть ли что-то, чего мне здесь не хватает, или мне нужно немного подождать, пока программа отправит письмо, а затем удалить файл .zip?

Ответы [ 2 ]

0 голосов
/ 09 сентября 2018

Лучшее решение этой проблемы - избавиться от объекта Attachment, который блокирует файл. Любой созданный вами объект, имеющий метод Dispose, должен вызывать этот метод, когда вы закончите работу с объектом, и Attachment ничем не отличается.

Dim fileAttachment As Attachment

If Label6.Text = "" Then
    fileAttachment = New Attachment(zipPath)
    mail.Attachments.Add(fileAttachment)
End If

'...

SmtpServer.Send(mail)

If fileAttachment IsNot Nothing Then
    fileAttachment.Dispose()
End If
0 голосов
/ 07 сентября 2018

Вы можете загрузить файл в массив: File.ReadAllBytes (String) Метод .

Затем получите MemoryStream из этого: Как преобразовать struct System.Byte byte [] в объект System.IO.Stream в C #?

И, наконец, вы можете использовать MemoryStream для вложения: Присоединить файл из MemoryStream к MailMessage в C # .

Поскольку данные для отправки находятся в памяти, вы сможете удалить файл. Обратите внимание, что в случае сбоя данные исчезают.

Примеры приведены на C #, но если у вас возникли проблемы с использованием методов в VB.NET, отредактируйте ваш вопрос, чтобы показать, как далеко вы продвинулись, и скажите нам, в чем проблема.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...