webForumDet fria alternativet

File.Delete

12 svar · 813 visningar · startad av Cale

CaleMedlem sedan mars 200490 inlägg
#1

Jag har ett galleri där jag vill kunna ta bort bilder.
Att ta bort sökvägen i databasen är inga problem men det strular lite när jag ska ta bort själva filen.
felmeddelande:
"Processen kan inte komma åt filen ...blabla\ormar\02.jpg eftersom den används i en annan process"

så jag undrar hur man stänger filen, eller alternativt om det finns en smidigare lösning?

sub btnDelete_Click(Sender as object, e as DataListCommandEventArgs)
	Dim Id As String = CType(e.Item.FindControl("ImageID"), Label).Text
	Dim TempDir As String = CType(e.Item.FindControl("ImageLocation"), Label).Text
	Dim FileName As String = CType(e.Item.FindControl("ImageUrl"), Label).Text
	TempDir = TempDir & FileName
	TempDir = Server.MapPath(TempDir)
		' Delete the file.
		File.Delete(TempDir)
        Dim strSQL4 As String = "DELETE * FROM images WHERE image_ID = " & Id
	
	Try
		Dim myCommand4 As New OleDbCommand(strSQL4, myConnection)
		myConnection.Open()
		Dim numRowsAffected As Integer = 0
		numRowsAffected = myCommand4.ExecuteNonQuery()
		myConnection.Close()
		If numRowsAffected <> 0 Then
			lblMessage.Text = "Bilden " & FileName & " har nu tagits bort!"
		Else
			lblMessage.Text = "Bilden " & FileName & " kunde INTE tas bort!"
		End If
		ImageDataList.EditItemIndex = -1
		FillDataList()
	Catch ex As Exception
		'# Errorhantering, logga felmeddelande !!
		lblMessage.Text = ex.Message
	End Try
End Sub
renholmMedlem sedan apr. 20012 266 inlägg
#2

Frågan är vart filen öppnad, använder du den någon annanstans i applikationen och glömmer att stänga Image-objektet?

CaleMedlem sedan mars 200490 inlägg
#3

tack för tipset.. jag kollade runt lite o hittade troligen orsaken

System.Drawing.Image.FromFile(imageUrl)

detta hittade jag på msdn library
"The file remains locked until the Image object is disposed."

det är för att göra tumnaglar av bilderna.
så nu gäller det bara att ta reda på hur man stänger det, tips?

GuffaMedlem sedan juni 2004533 inlägg
#4

Du anropar metoden Dispose för Image-objektet.

CaleMedlem sedan mars 200490 inlägg
#5

nej f*n.. jag klarar inte av det här..
lägger upp mer av koden och hoppas att ngn kan hjälpa mig..
såg att icaac haft (ungefär) samma promlem. i den här tråden

jag har försökt lite med .collect men får det inte att funka pga sättet som min bildvisning är uppbyggd (det är inte jag som gjort grunden)

thumbview.aspx gör bilderna små i datalist'en.

bildgalleri.aspx

    Protected Function GetImageName(ByVal image_url As String)
        Dim myConnection1 As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=" & Server.MapPath("db/images.mdb"))
        Dim strFileNameOnly As String = System.IO.Path.GetFileName(image_url)
        Dim strSQL1 As String = "SELECT image_location FROM images WHERE image_url =" & "'" & strFileNameOnly & "'"
        Dim myCommand1 As New OleDb.OleDbCommand(strSQL1, myConnection1)
		myConnection1.Open()
			Dim strLocationOnly As String = myCommand1.ExecuteScalar()
        myConnection1.Close()

		strFileNameOnly = strLocationOnly & strFileNameOnly
        Return strFileNameOnly
    End Function
'********************
	sub btnDelete_Click(Sender as object, e as DataListCommandEventArgs)
		Dim Id As String = CType(e.Item.FindControl("ImageID"), Label).Text
		Dim TempDir As String = CType(e.Item.FindControl("ImageLocation"), Label).Text
		Dim FileName As String = CType(e.Item.FindControl("ImageUrl"), Label).Text
		TempDir = TempDir & FileName
		TempDir = Server.MapPath(TempDir)

        Dim strSQL4 As String = "DELETE * FROM images WHERE image_ID = " & Id
		
		Try
			Dim myCommand4 As New OleDbCommand(strSQL4, myConnection)
			myConnection.Open()
			Dim numRowsAffected As Integer = 0
			numRowsAffected = myCommand4.ExecuteNonQuery()
			myConnection.Close()
			If numRowsAffected <> 0 Then
				lblMessage.Text = "Bilden " & FileName & " har nu tagits bort!"
			Else
				lblMessage.Text = "Bilden " & FileName & " kunde INTE tas bort!"
			End If
			ImageDataList.EditItemIndex = -1
			FillDataList()
		Catch ex As Exception
			'# Errorhantering, logga felmeddelande !!
			lblMessage.Text = ex.Message
		Finally
			'fullSizeImg.Collect()
			'GC.Collect()
			'Delete the file.
			File.Delete(TempDir)
		End Try
	End Sub

---------------------------------------------------
<img src='thumbview.aspx?img_name=<%#GetImageName(DataBinder.Eval(Container.DataItem, "image_url").ToString())%>'>

thumbview.aspx

<%@ Page Language="vb" debug="true" %>
<%@ import Namespace="System.Data" %>
<%@ import Namespace="System.Data.OleDb" %>
<%@ import Namespace="System.Drawing.Imaging" %>
<script runat="server">
'#*****************************************************************
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs)

    '#Hämta namnet på bilden
	Dim imageUrl As String = Request.QueryString("img_name")

    '#Lägg till hela sökvägen till filen
    imageUrl = Server.MapPath(imageUrl)

    dim fullSizeImg As System.Drawing.Image
    dim thumbNailImg As System.Drawing.Image
    '#Öppna bilden. Kan egentligen behövas try-catch här
    fullSizeImg = System.Drawing.Image.FromFile(imageUrl)

    '#Bilderna kan vara i två format 3:4 eller 4:3
    If fullSizeImg.Height < fullSizeImg.Width Then
        thumbNailImg = fullSizeImg.GetThumbnailImage(100, 75, Nothing, IntPtr.Zero)
    Else
        thumbNailImg = fullSizeImg.GetThumbnailImage(75, 100, Nothing, IntPtr.Zero)
    End If

    '#Eftersom jag bara tillåter JPEG eller GIF:
    If fullSizeImg.RawFormat.Equals(ImageFormat.Jpeg) Then
        Response.ContentType = "image/jpeg"
        thumbNailImg.Save(Response.OutputStream, ImageFormat.Jpeg)
    Else If fullSizeImg.RawFormat.Equals(ImageFormat.Gif) Then
        Response.ContentType = "image/gif"
        thumbNailImg.Save(Response.OutputStream, ImageFormat.Gif)
    Else
        '#Varken gif eller jpeg
        Response.End()
    End If
		'fullSizeImg.Collect()
End Sub
'#*****************************************************************
</script>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
    <head>
        <title>Thumbview</title>
    </head>
    <body>
        <form id="Form1" enctype="multipart/form-data" method="post" runat="server">
        </form>
    </body>
</html>
ironheadMedlem sedan mars 20011 346 inlägg
#6

Jag hade samma problem igår, med att jag inte kunde ta bort bildfiler...Jag gjorde såhär:

            Dim pic As ImageButton = New ImageButton
            pic.ImageUrl = IMAGE_DIRECTORY & Path.GetFileName(s)
            pic.Width = Unit.Pixel(imgWidth)
            pic.Height = Unit.Pixel(imgHeight)
            pic.AlternateText = Path.GetFileName(s)
            pic.CommandArgument = IMAGE_DIRECTORY & Path.GetFileName(s)
            AddHandler pic.Command, AddressOf Me.ShowImage
            PH.Controls.Add(pic)
            ' --------- Detta la jag till ------------
            pic.Dispose()
            GC.Collect()

När jag la till de 2 sista raderna, så gick det att tabort filerna med min funkltion som innehöll File.Delete(Server.MapPath(PicPath))

GuffaMedlem sedan juni 2004533 inlägg
#7

Cale skrev:

nej f*n.. jag klarar inte av det här..
jag har försökt lite med .collect men får det inte att funka pga sättet som min bildvisning är uppbyggd (det är inte jag som gjort grunden)

Image-objektet har ingen metod som heter collect.

Gör som jag sa och använd Dispose.

När du anropar metoden Dispose så frigörs resurserna som Image-objektet använde. Du behöver inte göra någon garbage collect efter det, det är bara onödigt. Systemet är oftast mycket bättre än du på att välja en lämplig tidpunkt för det.

renholmMedlem sedan apr. 20012 266 inlägg
#8

i C# finns en smidig sak som heter using()

using(Image image =  Image.FromFile(path))
{
   // gör det man vill med bilden
}
// Dispose körs för image.

I VB finns det ingen direkt motsvarighet (tror det kommer i v2) men det går att använda ett try ... finally block för att se till att objektet alltid disposas även vid exceptions.

CaleMedlem sedan mars 200490 inlägg
#9

Guffa skrev:

Image-objektet har ingen metod som heter collect.

Gör som jag sa och använd Dispose.

När du anropar metoden Dispose så frigörs resurserna som Image-objektet använde. Du behöver inte göra någon garbage collect efter det, det är bara onödigt. Systemet är oftast mycket bättre än du på att välja en lämplig tidpunkt för det.

kan du visa var jag ska använda dispose?
det jag inte får till är att bilden ändras i en annan fil (thumbview.aspx). som sedan anropas av bildgalleri.aspx..
det är i bildgalleri.aspx som koden för att ta bort filen finns.

GuffaMedlem sedan juni 2004533 inlägg
#10

Där du har skrivit:

'fullSizeImg.Collect()

ska du anropa Dispose för objekten:

fullSizeImg.Dispose()
thumbNailImg.Dispose()

CaleMedlem sedan mars 200490 inlägg
#11

men det är ju i bildgalleri.aspx..
fullSizeImg & thumbNailImg finns ju bara i thumbview.aspx..

det är just det jag inte kan komma förbi :)

felmeddelande:
"Namnet fullSizeImg har inte deklarerats"

GuffaMedlem sedan juni 2004533 inlägg
#12

Jaså, hade du en sådan i bildgalleri.aspx också. Jag menade naturligtvis den i thumbview.aspx, där du har de variablerna.

CaleMedlem sedan mars 200490 inlägg
#13

det verkar som att det kan fungera, ska experimentera lite mer.. för det hände ngt annat nu istället..

edit:
det får duga :)
det går i alla fall att ta bort filen nu

156 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
153 ms — hämta tråd, inlägg och bilagor (db)