30. maj 2005 - 21:29
Der er
15 kommentarer og 1 løsning
Luk forbindelse til fil efter brug?
Hej, Jeg downloader en fil med WebClient.DownloadFile() Filen skal så indlæses i mit program, og bagefter skal den bare slettes igen, men hvordan gør jeg det? Troede det var nok med Dispose() på webclienten, men det er vidst ikke det den gør alligevel: Her er mit forsøg: try { WebClient client = new WebClient(); using (client) { client.DownloadFile(movie.CoverURL, @"C:\cover.tmp"); cover.Image = Image.FromFile(@"C:\cover.tmp"); client.Dispose(); } } catch (Exception ex) { MessageBox.Show(ex.ToString()); } finally { File.Delete(@"C:\cover.tmp"); } Som det er nu kan jeg ikke slette filen i min finally-blok, fordi filen stadig er "aktiv". God råd modtages med kyshånd. /pfp
Annonceindlæg tema
Jeg er ikke helt sikker på at du faktisk får udført din Dispose(). Prøv sådan her: try { using (WebClient client = new WebClient()) { client.DownloadFile(movie.CoverURL, @"C:\cover.tmp"); cover.Image = Image.FromFile(@"C:\cover.tmp"); client.Dispose(); } } catch (Exception ex) { MessageBox.Show(ex.ToString()); } finally { File.Delete(@"C:\cover.tmp"); }
Det gør desværre ingen forskel. Den fanger ikke nogen exception med hverken din metode eller min, til gengæld kastes der så en exception i finally-blokken. Jeg var egentlig af den opfattelse, at det smarte i at bruge using "snippeten" var at den selv lukkede sine resourcer?
Det er det også. Rent faktisk er dit interne kald til client.Dispose() totalt overflødigt.
"Det er det også. Rent faktisk er dit interne kald til client.Dispose() totalt overflødigt." Ja det ved jeg egentlig godt, men man griber vel til drastiske metoder når tingene ikke virker :)
Fandt denne her sætning under online-hjælpen for Image.FromFile metoden: "The file remains locked until the Image object is disposed."
Heldet er bare ikke med mig i aften: try { using (WebClient client = new WebClient()) { client.DownloadFile(movie.CoverURL, @"C:\cover.tmp"); Image img = Image.FromFile(@"C:\cover.tmp"); cover.Image = img; img.Dispose(); } } catch (Exception ex) { MessageBox.Show(ex.ToString()); } finally { File.Delete(@"C:\cover.tmp"); } Så får jeg en exception for hele applikationen?? Debuggeren springer til: Application.Run(new Form1()); og siger "Parameter is not valid"
Når du går via din variabel, img, ender du faktisk med to objekter som peger på det *samme* Image - "img" og "cover.Image". Derfor går det galt når du forsøger at Dispose den ene men ikke den anden. Du kan først slette filen efter at cover er blevet nedlagt - eller at cover.Image er blevet sat til null.
hvorfor overhovedet bruge tid og kræfter på at hente filen ned på harddisken, når at den alligevel slettes med det samme igen??!?! Hent den ned i en Stream i hukommelsen, og brug Image.FromStream() istedet for at vise billedet i dit program.
nielle -> Tak :) burningice -> Det kan du da have ret i, det havde ikke lige krydset lystavlen.
Så hvem går points til? Mig, som kuns forklarede dig hvor din kode ikke virkede, eller Burningice som rent faktisk anviste en måde at gøre det på? :^)
02. juni 2005 - 01:37
#11
nielle -> Jeg syntes da du skal have point, du svarede jo på mit spørgsmål :) Men derfor tak til burningice alligevel for forslag til alternativ løsning på problemet.
02. juni 2005 - 16:11
#12
Svar :^)
26. juni 2005 - 19:17
#13
det var vel ikke en alternativ løsning, men mere en optimering, da der ikke er nogen grund til at gemme filen på harddisken for at slette den igen 5 linjer senere.
27. juni 2005 - 01:11
#14
Vi kan også kalde din løsning den rigtige eller primære, og så det andet for en alternativ løsning. Opretter gerne et nyt spm. så du kan få point...
27. juni 2005 - 01:52
#15
:) nej nej, det er der skam ikke brug for. Jeg kommer gerne med svar, kommentarer og gode råd gratis.
27. juni 2005 - 09:44
#16
Tak :)
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.