According to MSDN the .NET 4 API to enumerate directories can leak
handles and I may need to explicitly call the garbage collector if I
want to delete directories or files after enumerating them (http://
msdn.microsoft.com/en-us/library/dd997370.aspx). I hope this is not a
problem If I use foreach in C# because it should call Dispose which in
turn should release the handles.

This problem seems to be particular of windows XP:
"
If you are running Windows XP or earlier, a delete operation on a file
or directory that follows an enumeration could fail if there is an
open handle that remains on one of the enumerated directories or
files. If this is occurring, you must induce a garbage collection to
remove the open handles.
"
And:
"
To remove open handles on enumerated directories or files

Create a custom method (or function in Visual Basic) to contain your
enumeration code.

Apply the MethodImplAttribute attribute with the NoInlining option to
the new method. For example:

[MethodImplAttribute(MethodImplOptions.NoInlining)]
Private void Enumerate()
Include the following method calls, to run after your enumeration
code:

The GC.Collect() method (no parameters).

The GC.WaitForPendingFinalizers() method.
"

I found a related question in stackoverflow:
http://stackoverflow.com/questions/2663574/strange-thing-about-net-4-0-filesystem-enumeration-functionality

Does anybody know if there is a way to avoid that leak? perhaps using
only TopDirectoryOnly instead of AllDirectories? Is it safe if I make
sure I call Dispose? Can anybody test it on Windows XP?

I was suspecting that the leak is caused because the handles may have
been open before the enumerator is created, and thefore are kept open
by the enumerable. As it turns out the enumerator and the enumerable
are the same object, except if you call GetEnumerator in another
thread, in which case you get a clone.

Note that this information has been removed for the documentation
of .NET 4.5, does that means that .NET 4.5 fixes the issue?

Thanks.

-- 
You received this message because you are subscribed to the Google
Groups "DotNetDevelopment, VB.NET, C# .NET, ADO.NET, ASP.NET, XML, XML
Web Services,.NET Remoting" group.
To post to this group, send email to dotnetdevelopment@googlegroups.com
To unsubscribe from this group, send email to
dotnetdevelopment+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/dotnetdevelopment?hl=en?hl=en
or visit the group website at http://megasolutions.net

Reply via email to