Thanks guys,<br><br>Error handling seems to be a nice idea to approach this problem. i checked Kent's code and it works fine.<br><br>I was using a more crude method.<br><br>def removeDir(dirName) :<br>&nbsp;&nbsp;&nbsp; #Remove any read-only permissions on file.
<br>&nbsp;&nbsp;&nbsp; removePermissions(dirName)<br>&nbsp;&nbsp;&nbsp; for name in os.listdir(dirName):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; file = os.path.join(dirName, name)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if not os.path.islink(file) and os.path.isdir(file):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; removeDir(file)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else:
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; removePermissions(file)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; os.remove(file)<br>&nbsp;&nbsp;&nbsp; os.rmdir(dirName)<br>&nbsp;&nbsp;&nbsp; return<br>def removePermissions(filePath) :<br>&nbsp;&nbsp;&nbsp; #if (os.access(filePath, os.F_OK)) : #If path exists<br>&nbsp;&nbsp;&nbsp; if (not 
os.access(filePath, os.W_OK)) :<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; os.chmod(filePath, 0666)<br>&nbsp;&nbsp;&nbsp; return<br><br>however shutil seems to be more simple and efficient here!<br><br>Regards,<br><br>Amresh <br><br><div><span class="gmail_quote">On 6/16/06, 
<b class="gmail_sendername">Kent Johnson</b> &lt;<a href="mailto:kent37@tds.net">kent37@tds.net</a>&gt; wrote:</span><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
John Corry wrote:<br>&gt;<br>&gt; Amresh,<br>&gt;<br>&gt; I had this problem a few months back.&nbsp;&nbsp;I approached it backwards.&nbsp;&nbsp;Maybe<br>&gt; not the right way to do it.&nbsp;&nbsp;I removed all the files and directories and<br>&gt; then had my exception handle the file if it was read only.&nbsp;&nbsp;The
<br>&gt; exception&nbsp;&nbsp;handler changes the file from read-only to not read only and<br>&gt; then calls the function again.<br>&gt;<br>&gt; Is there a better way to do it?&nbsp;&nbsp;Would appreciate feedback on the code<br>&gt; below.
<br>&gt;<br>&gt; import shutil<br>&gt; import os<br>&gt;<br>&gt; def zaps(self):<br>&gt;<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try:<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; shutil.rmtree('f:/m2m')<br>&gt;<br>&gt;<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; except OSError, inst:<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print OSError
<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; os.chmod(inst.filename, 0666)<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.zaps()<br><br>I imagine this could be expensive if you have a deep directory hierarchy<br>with lots of read-only files - you have to start the traversal from
<br>scratch each time you get an error. If you have more than 1000 read-only<br>files you will get a stack overflow from the recursion.<br><br>shutil.rmtree() actually takes an optional error handler argument.<br>According to the docs, &quot;If onerror is provided, it must be a callable
<br>that accepts three parameters: function, path, and excinfo. The first<br>parameter, function, is the function which raised the exception; it will<br>be os.listdir(), os.remove() or os.rmdir().&quot;<br><br>So something like this should work and be faster because the directory
<br>traversal doesn't restart each time (UNTESTED!!):<br><br>def handle_error(fn, path, excinfo):<br>&nbsp;&nbsp; if fn is os.rmdir:<br>&nbsp;&nbsp;&nbsp;&nbsp; # handle readonly dir<br>&nbsp;&nbsp;&nbsp;&nbsp; os.chmod(path, 0666) # ?? not sure if this is correct for a dir
<br>&nbsp;&nbsp;&nbsp;&nbsp; os.rmdir(path) # try again<br>&nbsp;&nbsp; elif fn is os.remove:<br>&nbsp;&nbsp;&nbsp;&nbsp; os.chmod(path, 0666)<br>&nbsp;&nbsp;&nbsp;&nbsp; os.remove(path)<br><br>shutil.rmtree(top, onerror=handle_error)<br><br>Kent<br><br>_______________________________________________
<br>Tutor maillist&nbsp;&nbsp;-&nbsp;&nbsp;<a href="mailto:Tutor@python.org">Tutor@python.org</a><br><a href="http://mail.python.org/mailman/listinfo/tutor">http://mail.python.org/mailman/listinfo/tutor</a><br></blockquote></div><br><br clear="all">
<br>-- <br>~~AMRESH~~