CaleMedlem sedan mars 200490 inlägg 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 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 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 Du anropar metoden Dispose för Image-objektet.
CaleMedlem sedan mars 200490 inlägg 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 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
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 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
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 Där du har skrivit:
'fullSizeImg.Collect()
ska du anropa Dispose för objekten:
fullSizeImg.Dispose()
thumbNailImg.Dispose()
CaleMedlem sedan mars 200490 inlägg 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 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 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