Groups | Blog | Home
all groups > vb.net > january 2006 >

vb.net : When I get the image from the file the file remains locked


Lucky
1/16/2006 8:45:42 PM
hi,
the problem here with cloning method is it also copies the reference
of the file that is loaded in the IMAGE object so that if you dispose
the zz object after cloning, it passes reference of the file to MyImage
object that's why ultimately the file remains locked.

try this code. this should solve your problem

Dim fs As New StreamReader("C:\all.jpg")
Dim img As Image = Image.FromStream(fs.BaseStream)
fs.Close()
PictureBox1.Image = img
File.Delete("C:\all.jpg")


Lucky
**Developer**
1/16/2006 10:28:43 PM
When I get the image from the file the file remains locked so the Delete
fails with a "used by another process"

So I tried using a clone and disposing the obtained image.

But that didn't fix the problem.

Can you help?



Dim zz As Image = Image.FromFile(imageFileName)

MyImage = zz.Clone

zz.Dispose()

zz = Nothing

File.Delete(imageFileName)

Lucky
1/17/2006 12:24:29 AM
well first you need to understand the behaviour of the class and the
way it treats the resources.

in your case IMAGE class lock the resources so that if any call for
refresh/reload needs to attend by the object than the original data can
be reloaded or modified by the object itself.

i dont know why it is like this in IMAGE class but MS has implimented
it this way only.

run my code and compare it with your's and you'll see the difference
and behaviour of the class

Lucky
Michael D. Ober
1/17/2006 5:17:52 AM

I'd really like to know if this works. The Kodak Image drivers in Windows
98 and NT4 have the same problem. I always thought this was a bug in the
Kodak drivers, but if it exists in .NET (which doesn't use the Kodak
drivers) as well, then the problem may actually be in the underlying Win32
API.

Mike Ober.

[quoted text, click to view]


**Developer**
1/17/2006 9:16:31 AM
Thanks a lot

[quoted text, click to view]

**Developer**
1/17/2006 10:07:11 AM
I don't think I can use your suggestion. I try to make it easy to see the
problem by shorting the code but I'm afriad I cut out too much code. Below
might be more then required to show the problem but I hope I didn't cut
anything relavent.



I believe the problen code starts where I left the blank lines below.



Dim wiaManager As WiaClass = Nothing ' WIA manager COM object

Dim wiaDevs As CollectionClass = Nothing ' WIA devices collection COM object

Dim wiaRoot As ItemClass = Nothing ' WIA root device COM object

Dim wiaPics As CollectionClass = Nothing ' WIA collection COM object

Dim wiaItem As ItemClass = Nothing ' WIA image COM object

Dim imageFileName As String

wiaManager = New WiaClass ' create COM instance of WIA manager

wiaDevs = wiaManager.Devices '

wiaDevs = wiaManager.Devices ' as CollectionClass; ' call Wia.Devices to get
all devices

If wiaDevs Is Nothing OrElse wiaDevs.Count = 0 Then

MessageBox.Show("No WIA devices found!", "WIA", MessageBoxButtons.OK,
MessageBoxIcon.Stop)

Application.Exit()

Return Nothing

End If

Dim selectUsingUI As Object = System.Reflection.Missing.Value ' = Nothing

wiaRoot = CType(wiaManager.Create(selectUsingUI), ItemClass) ' Display form
to let the user select device

If wiaRoot Is Nothing Then ' nothing to do

Return Nothing

End If

wiaPics = wiaRoot.GetItemsFromUI(WiaFlag.SingleImage,
WiaIntent.ImageTypeColor) 'Open acquisition form to get a single image.

If wiaPics Is Nothing Then

Return Nothing

End If





Dim wiaObj As Object = wiaPics.Item(0)

wiaItem = CType(Marshal.CreateWrapperOfType(wiaObj, GetType(ItemClass)),
ItemClass)

imageFileName = Path.GetTempFileName() ' create temporary file for image

wiaItem.Transfer(imageFileName, False) ' Now do the scan and then transfer
picture to our temporary file (only way to get it)

Dim zz As Image = Image.FromFile(imageFileName) ' create Image instance from
file

AcquireScanner = zz.Clone

zz.Dispose() 'Unlock the file

zz = Nothing

File.Delete(imageFileName)



[quoted text, click to view]





**Developer**
1/17/2006 10:09:19 AM
Thanks, please see reply I just sent Lucky's first post


[quoted text, click to view]

**Developer**
1/17/2006 10:11:31 AM
What is the penalty for not deleting a temp file?

Is that a way to go?



[quoted text, click to view]

**Developer**
1/17/2006 10:31:04 AM
I tried deleting after I released wiaItem and wiaObj but the problem remains


[quoted text, click to view]

R. MacDonald
1/17/2006 11:47:55 AM
A bug, or a "feature"? I seem to recall a similar problem and found a
this reference that provided some insight.

http://support.microsoft.com/?id=814675

Cheers,
Randy

[quoted text, click to view]
Herfried K. Wagner [MVP]
1/17/2006 3:41:30 PM
" **Developer**" <REMOVEdeveloper@a-znet.com> schrieb:
[quoted text, click to view]

Check out the code snippets at
<URL:http://dotnet.mvps.org/dotnet/code/graphics/#ImageNoLock>.

--
M S Herfried K. Wagner
M V P <URL:http://dotnet.mvps.org/>
V B <URL:http://classicvb.org/petition/>
**Developer**
1/17/2006 6:59:02 PM
What I mean
is the file there forever or does Window eventually delete it




[quoted text, click to view]

Lucky
1/17/2006 10:49:32 PM
i'm not sure when and how windows manages file in temp folder but
deleting files from code after use, is best practice.

Lucky
Michael D. Ober
1/19/2006 3:41:46 AM

I still think it's a bug in the GDI itself. When you close the references
to an image using the COM interface, the image control should go away. It
doesn't - I know because I tested this heavily and finally discovered that
the only way to reliably "unlock" the file is to set the image to another
file first.

Mike.

[quoted text, click to view]


Michael D. Ober
1/19/2006 3:42:39 AM

Based on my experience with the Kodak drivers, you get an error when you
attempt to delete the file. Windows won't delete it later.

Mike Ober.

[quoted text, click to view]


**Developer**
1/19/2006 9:33:04 AM
Thanks for the two replies.
Did you see Lucky's second post?
Sound reasonable to me.
How does it sound to you?




[quoted text, click to view]

**Developer**
1/21/2006 3:18:37 PM
Sounds like a good work around.
Based on Lucky's post I looked to see if there file reference was
available - but found nothing.

thanks

[quoted text, click to view]

Michael D. Ober
1/21/2006 7:24:20 PM

I solved my problem (7 years ago) by keeping a "dummy.jpg" around that I
assign to the control. Once I started doing this, I was able to delete the
original file.

Mike.

[quoted text, click to view]


Barry
1/21/2006 11:05:00 PM
This works for me... after you close the lcl_fso the file can be
deleted, just don't get rid of the byte_old.

Dim lcl_filename As System.String = "c:\temp\images\test.tif"
Dim lcl_fso As New System.IO.FileStream(lcl_filename, _
IO.FileMode.Open, IO.FileAccess.Read, IO.FileShare.Read)
Dim byte_old() As Byte
Dim tmpint As Integer = Convert.ToInt32(lcl_fso.Length())
With lcl_fso
ReDim byte_old(tmpint)
.Read(byte_old, 0, tmpint)
End With
lcl_fso.Close()
Dim memstream As New System.IO.MemoryStream(byte_old)
Dim lcl_holdimage As System.Drawing.Image = _
System.Drawing.Image.FromStream(memstream)

HTH,
Barry

On Sat, 21 Jan 2006 15:18:37 -0500, " **Developer**"
[quoted text, click to view]

**Developer**
1/22/2006 9:46:44 PM
Works for me too.
I'll bet I not the only one that will copy your approach.

Thanks


[quoted text, click to view]

AddThis Social Bookmark Button