Home All Groups Group Topic Archive Search About

File IO and Threading

Author
6 Oct 2006 7:09 PM
Jayme Pechan
I seem to have run into a strange problem.  I'm hoping one of you understand
the inner working of the file IO better than I and could explain why I'm
seeing what I am.  Basically, I have a log folder where I append to text
files frequently.  Every 10 minutes or so, I check to see if the files are
greater than a certain size and then archive them.  After archiving the
files, I use the File.Delete function to delete each of the files.  I put
the File.Delete in a lock section to ensure that it completes before another
threat attempts to write to them.  The problem I'm seeing is that it seems
like the File.Delete doesn't delete the files immediately and even though it
is supposed to remove it from the directory tree (I think), if another
thread attempts to append to one of these files too soon after leaving my
lock block, the whole program locks up.  I thought of putting in a sleep
after the deletions but I wouldn't know how long to set it for.

My solution is to move the files to a sub folder first before deleting them
but wanted to see if anyone would know why I'm having this problem in the
first place.

Thanks

Jayme

Author
7 Oct 2006 7:59 PM
Sean Chambers
A better way would be to rename the file first, like logfile.log.old.

This way if another thread tries to write, it will recreate the file as
the file doesn't exist, then shortly thereafter the logfile.log.old is
deleted.

Would this work?

If not, try putting a 10ms sleep, then 20ms, all the way up until you
find the correct amount of time to sleep for, although I would
recommend against putting the thread to sleep. I don't usually use this
method as it feels kind of clunky to me.

Sean

Jayme Pechan wrote:
Show quote
> I seem to have run into a strange problem.  I'm hoping one of you understand
> the inner working of the file IO better than I and could explain why I'm
> seeing what I am.  Basically, I have a log folder where I append to text
> files frequently.  Every 10 minutes or so, I check to see if the files are
> greater than a certain size and then archive them.  After archiving the
> files, I use the File.Delete function to delete each of the files.  I put
> the File.Delete in a lock section to ensure that it completes before another
> threat attempts to write to them.  The problem I'm seeing is that it seems
> like the File.Delete doesn't delete the files immediately and even though it
> is supposed to remove it from the directory tree (I think), if another
> thread attempts to append to one of these files too soon after leaving my
> lock block, the whole program locks up.  I thought of putting in a sleep
> after the deletions but I wouldn't know how long to set it for.
>
> My solution is to move the files to a sub folder first before deleting them
> but wanted to see if anyone would know why I'm having this problem in the
> first place.
>
> Thanks
>
> Jayme
Author
7 Oct 2006 9:03 PM
Michael D. Ober
Can we see your code.  At least the writes and deletes.

Thanks,
Mike Ober.

Show quote
"Sean Chambers" <dko***@gmail.com> wrote in message
news:1160251158.389568.11720@b28g2000cwb.googlegroups.com...
> A better way would be to rename the file first, like logfile.log.old.
>
> This way if another thread tries to write, it will recreate the file as
> the file doesn't exist, then shortly thereafter the logfile.log.old is
> deleted.
>
> Would this work?
>
> If not, try putting a 10ms sleep, then 20ms, all the way up until you
> find the correct amount of time to sleep for, although I would
> recommend against putting the thread to sleep. I don't usually use this
> method as it feels kind of clunky to me.
>
> Sean
>
> Jayme Pechan wrote:
> > I seem to have run into a strange problem.  I'm hoping one of you
understand
> > the inner working of the file IO better than I and could explain why I'm
> > seeing what I am.  Basically, I have a log folder where I append to text
> > files frequently.  Every 10 minutes or so, I check to see if the files
are
> > greater than a certain size and then archive them.  After archiving the
> > files, I use the File.Delete function to delete each of the files.  I
put
> > the File.Delete in a lock section to ensure that it completes before
another
> > threat attempts to write to them.  The problem I'm seeing is that it
seems
> > like the File.Delete doesn't delete the files immediately and even
though it
> > is supposed to remove it from the directory tree (I think), if another
> > thread attempts to append to one of these files too soon after leaving
my
> > lock block, the whole program locks up.  I thought of putting in a sleep
> > after the deletions but I wouldn't know how long to set it for.
> >
> > My solution is to move the files to a sub folder first before deleting
them
> > but wanted to see if anyone would know why I'm having this problem in
the
> > first place.
> >
> > Thanks
> >
> > Jayme
>
>
Author
8 Oct 2006 3:58 AM
Gaurav Vaish (www.EdujiniOnline.com)
> like the File.Delete doesn't delete the files immediately and even though
> it is supposed to remove it from the directory tree (I think), if another

Are you sure that when you are deleting the file, the file is not already
opened?

If the file is already opened, File.Delete will not throw any exception but
the file will be deleted only when it is closed.

The method is nothing but a wrapper around the DeleteFile method in Win32
API (see url below).

    http://windowssdk.msdn.microsoft.com/en-gb/library/ms685330.aspx

Pay attention to the 'Remarks' section:

[quote]
The DeleteFile function marks a file for deletion on close. Therefore, the
file deletion does not occur until the last handle to the file is closed.
[/quote]


Hope that helps...



--
Happy Hacking,
Gaurav Vaish | www.mastergaurav.com
www.edujinionline.com
http://eduzine.edujinionline.com
-----------------------------------------

AddThis Social Bookmark Button