The process cannot access the file   zodpovězená otázka

VB.NET

Dobrý den,

jsem začátečník v programování ve vb.net a narazil jsem na jeden problém, který se mi nedaří vyřešit. Napsal jsem si malý jednoduchý prográmek na odesílání e-mailu s přílohou pomocí smtp. Vše funguje až na jednu maličkost.Po odeslání e-mailu má můj prográmek smazat přílohu z hardisku. Je to jeden soubor a to obrázek ve formátu jpeg. Vždy to při pokusu o smazání vyvolá chybové hlášení, že daný soubor je právě používán jiným procesem. Už jsem prohledal různá fóra, ale žádné rozumné řešení jsem nenašel. Mohl by mi někdo poradit nebo alespoň navést na cestu řešení? Děkuji předem za jakoukoli radu.

 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim file As String = "c:/screenshot.jpeg"
        Dim smtp_server As String = "muj_smtp"
        Dim mail As New System.Net.Mail.MailMessage()
        Dim MsgAttach As New System.Net.Mail.Attachment(file) 
        Dim smtp As New System.Net.Mail.SmtpClient(smtp_server)

       
        mail.From = New System.Net.Mail.MailAddress("adresa.cz")
        mail.To.Add("adresa")

        
        mail.Subject = "Screenshot"
        mail.Body = "Posílám ti ten screenshot. "

        
        mail.Attachments.Add(MsgAttach)
        smtp.Send(mail)

        System.IO.File.Delete(file)

        Application.Exit()

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Zkuste soubor smazat vícekrát a mezi to vložte čekání, například 200ms. Soubor se brzy po odeslání uvolní, nenapadá mě jak jinak uvolnění urychlit. Z hlavy:

Dim attempIndex As Integer = 1
Dim attempSuccess As Boolean = False
Do While (attempSuccess = False And attempIndex < 5)
    If attempIndex > 1 Then Threading.Thread.Sleep(200) ' cekat 200ms
    
    Try
        System.IO.File.Delete(file)
        attempSuccess = True
    Catch
        
    End Try
    
    attempIndex += 1
Loop

If attempSuccess = False Then Throw New Exception("Soubor nelze smazat.")

Editováné: Toto řešení není vhodné. Využijte řešení Ondřeje Linharta.

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Myslel jsem že by mohlo pomoct asynchronní odeslání zprávy pomocí SendAsync a smazání souboru v události SendCompleted ale nepomáhá to. Vámi uvedeným postupem se soubor neuvolnil ani po 30 vteřinách, přesto že byla zpráva již dávno korektně odeslána i s přílohou...

Edit: Vyřešeno! Třída MailMessage (nebo Attachment) si zřejmě uvnitř sebe udržuje otevřený soubor a proto nejde smazat. Řešením je po odeslání zprávy (MailMessage) u této zprávy zavolat Dispose (nebo použít Using...End Using) a teprve potom soubor smazat.

Dim smtp As New SmtpClient("company.mail.cz")
Using msg As New MailMessage("[email protected]", "[email protected]")
  msg.Attachments.Add(New Attachment("C:\Picture.jpeg"))
  smtp.Send(msg)
End Using
IO.File.Delete("C:\Picture.jpeg")

nahlásit spamnahlásit spam 0 / 2 odpovědětodpovědět

Send není asynchronní funkce. Proto SendCompleted nepomůže.

Ano máte pravdu, překouknul jsem se při hledání a implementaci IDisposable jsem hledal jen u SmtpClient třídy, kde není. U MailMessage jsem si ji nevšimnul. Proto jsem navrhnul řešení s čekáním. Ano, vaše řešení je to správné.

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Mockrát děkuji za radu. Funguje je to bezproblémově. ;-)

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

1

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

1

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

1

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

1

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

1

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

1

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

1

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

1

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

1

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

1

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

1

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

1

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

1

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

1

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

1

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

1

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

1

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

1

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

1

nahlásit spamnahlásit spam 0 odpovědětodpovědět

1

nahlásit spamnahlásit spam 0 odpovědětodpovědět

1

nahlásit spamnahlásit spam 0 odpovědětodpovědět

1

nahlásit spamnahlásit spam 0 odpovědětodpovědět

1

nahlásit spamnahlásit spam 0 odpovědětodpovědět

1

nahlásit spamnahlásit spam 0 odpovědětodpovědět

1

nahlásit spamnahlásit spam 0 odpovědětodpovědět

1

nahlásit spamnahlásit spam 0 odpovědětodpovědět

1

nahlásit spamnahlásit spam 0 odpovědětodpovědět

1

nahlásit spamnahlásit spam 0 odpovědětodpovědět

1

nahlásit spamnahlásit spam 0 odpovědětodpovědět

1

nahlásit spamnahlásit spam 0 odpovědětodpovědět

23LyFQ5q

nahlásit spamnahlásit spam 0 odpovědětodpovědět

-1 OR 2+444-444-1=0+0+0+1 --

nahlásit spamnahlásit spam 0 odpovědětodpovědět

-1 OR 2+556-556-1=0+0+0+1

nahlásit spamnahlásit spam 0 odpovědětodpovědět

-1' OR 2+586-586-1=0+0+0+1 --

nahlásit spamnahlásit spam 0 odpovědětodpovědět

-1' OR 2+146-146-1=0+0+0+1 or 'uvEaK43p'='

nahlásit spamnahlásit spam 0 odpovědětodpovědět

-1" OR 2+389-389-1=0+0+0+1 --

nahlásit spamnahlásit spam 0 odpovědětodpovědět

if(now()=sysdate(),sleep(15),0)

nahlásit spamnahlásit spam 0 odpovědětodpovědět

-1; waitfor delay '0:0:15' --

nahlásit spamnahlásit spam 0 odpovědětodpovědět

-1); waitfor delay '0:0:15' --

nahlásit spamnahlásit spam 0 odpovědětodpovědět

-1)); waitfor delay '0:0:15' --

nahlásit spamnahlásit spam 0 odpovědětodpovědět

1 waitfor delay '0:0:15' --

nahlásit spamnahlásit spam 0 odpovědětodpovědět

sDUDTJ07'; waitfor delay '0:0:15' --

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Cj6d2WL8'); waitfor delay '0:0:15' --

nahlásit spamnahlásit spam 0 odpovědětodpovědět

SRnBj7g6')); waitfor delay '0:0:15' --

nahlásit spamnahlásit spam 0 odpovědětodpovědět

-5 OR 15=(SELECT 15 FROM PG_SLEEP(15))--

nahlásit spamnahlásit spam 0 odpovědětodpovědět

-5) OR 368=(SELECT 368 FROM PG_SLEEP(15))--

nahlásit spamnahlásit spam 0 odpovědětodpovědět

-1)) OR 579=(SELECT 579 FROM PG_SLEEP(15))--

nahlásit spamnahlásit spam 0 odpovědětodpovědět

IB39JBWu' OR 409=(SELECT 409 FROM PG_SLEEP(15))--

nahlásit spamnahlásit spam 0 odpovědětodpovědět

uU2CY9Li') OR 503=(SELECT 503 FROM PG_SLEEP(15))--

nahlásit spamnahlásit spam 0 odpovědětodpovědět

ZqUHTaaq')) OR 411=(SELECT 411 FROM PG_SLEEP(15))--

nahlásit spamnahlásit spam 0 odpovědětodpovědět

1*DBMS_PIPE.RECEIVE_MESSAGE(CHR(99)||CHR(99)||CHR(99),15)

nahlásit spamnahlásit spam 0 odpovědětodpovědět

1'||DBMS_PIPE.RECEIVE_MESSAGE(CHR(98)||CHR(98)||CHR(98),15)||'

nahlásit spamnahlásit spam 0 odpovědětodpovědět

1'"

nahlásit spamnahlásit spam 0 odpovědětodpovědět

@@xsatt

nahlásit spamnahlásit spam 0 odpovědětodpovědět

1

nahlásit spamnahlásit spam 0 odpovědětodpovědět

1

nahlásit spamnahlásit spam 0 odpovědětodpovědět

1

nahlásit spamnahlásit spam 0 odpovědětodpovědět

1

nahlásit spamnahlásit spam 0 odpovědětodpovědět

1

nahlásit spamnahlásit spam 0 odpovědětodpovědět

1

nahlásit spamnahlásit spam 0 odpovědětodpovědět

1

nahlásit spamnahlásit spam 0 odpovědětodpovědět

1

nahlásit spamnahlásit spam 0 odpovědětodpovědět

1

nahlásit spamnahlásit spam 0 odpovědětodpovědět

1

nahlásit spamnahlásit spam 0 odpovědětodpovědět

1

nahlásit spamnahlásit spam 0 odpovědětodpovědět

1

nahlásit spamnahlásit spam 0 odpovědětodpovědět

1

nahlásit spamnahlásit spam 0 odpovědětodpovědět

1

nahlásit spamnahlásit spam 0 odpovědětodpovědět

1

nahlásit spamnahlásit spam 0 odpovědětodpovědět

1

nahlásit spamnahlásit spam 0 odpovědětodpovědět

1

nahlásit spamnahlásit spam 0 odpovědětodpovědět

1

nahlásit spamnahlásit spam 0 odpovědětodpovědět

1

nahlásit spamnahlásit spam 0 odpovědětodpovědět

1

nahlásit spamnahlásit spam 0 odpovědětodpovědět

1

nahlásit spamnahlásit spam 0 odpovědětodpovědět

1

nahlásit spamnahlásit spam 0 odpovědětodpovědět

1

nahlásit spamnahlásit spam 0 odpovědětodpovědět

1

nahlásit spamnahlásit spam 0 odpovědětodpovědět

1

nahlásit spamnahlásit spam 0 odpovědětodpovědět

1

nahlásit spamnahlásit spam 0 odpovědětodpovědět

1

nahlásit spamnahlásit spam 0 odpovědětodpovědět

1

nahlásit spamnahlásit spam 0 odpovědětodpovědět

1

nahlásit spamnahlásit spam 0 odpovědětodpovědět

1

nahlásit spamnahlásit spam 0 odpovědětodpovědět

1

nahlásit spamnahlásit spam 0 odpovědětodpovědět

1

nahlásit spamnahlásit spam 0 odpovědětodpovědět

1

nahlásit spamnahlásit spam 0 odpovědětodpovědět

1

nahlásit spamnahlásit spam 0 odpovědětodpovědět

1

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback