I''ve done some more reading and this is where I've got to:<div><br></div><div>shutil.move() uses either os.rename() or shutil.copyfile() (via shutil.copytree()) depending on the situation. shutil.copyfile() uses open().  So to implement a safe move function it would seem to be necessary to do the same to copyfile(), and possibly open().  </div>
<div><br></div><div>open(), in my opinon, already behaves as it should.  It would be possible to add a slightly safer implementation by writing to a temporary file first, but this would not always be desired or even possible. Perhaps an alternative function could be added if the idea is popular enough?</div>
<div><br></div><div>I would expect copyfile(), like move(), to fail if the destination exists.  This is not the current behaviour, so both functions could benefit from this.</div><div><br></div><div>From what I've read, there are several ways of ensuring that these functions fail if destination exists depending on the platform and filesystem, but there is no uniform way to do it. One approach would be to try all possible methods and hope that at least one works, with a simple "if os.exists(dst): fail" fallback.  The documentation would state that "An exception occurs if the destination exists.  This check is done is as safe a way possible to avoid race conditions where the system supports it."  An additional measure of safety on copyfile() would be to write to a temporary file first, then use move. This would allow rollback in case of failure during the copy, but as with open(), its not always the most appropriate approach.</div>
<div><br></div><div>Adding new copyfile() and move() functions would mean also mean adding new copy(), copy2() and copytree() functions, perhaps as copy3() and copytree2(). This seems to be getting rather messy - three slightly different copy functions, so it might still be better to add an optional argument to these.  Alternatively, a new module could be added dedicated to safe file operations.</div>
<div><br></div><div><div class="gmail_quote">On Sun, Aug 14, 2011 at 5:23 PM, David Townshend <span dir="ltr"><<a href="mailto:aquavitae69@gmail.com">aquavitae69@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<p>Sorry, yes. That is what I meant.</p><div><div></div><div class="h5">
<div class="gmail_quote">On Aug 14, 2011 5:12 PM, "Devin Jeanpierre" <<a href="mailto:jeanpierreda@gmail.com" target="_blank">jeanpierreda@gmail.com</a>> wrote:<br type="attribution">>> Why do you think that move on remote file systems use copy? From past<br>

>> experience and recent tests I can confirm that shutil.move() uses rename<br>>> on remote CIFS and NFS file systems<br>> <br>> I believe what he meant to say was "if you move from one filesystem to another".<br>

> <br>> shutil.move tries to do a copy and delete if rename fails with an OSError.<br>> <br>> Devin<br>> <br>> On Sun, Aug 14, 2011 at 10:39 AM, Christian Heimes <<a href="mailto:lists@cheimes.de" target="_blank">lists@cheimes.de</a>> wrote:<br>

>> Am 14.08.2011 16:09, schrieb David Townshend:<br>>>> It seems there's a second problem too - move on remote file systems use copy<br>>>> rather than rename, so changing the implementation means changing it for<br>

>>> copy too, which is more difficult. Maybe the best option is to try to apply<br>>>> some sort of locking mechanism, but I can't see how right now.<br>>><br>>> Why do you think that move on remote file systems use copy? From past<br>

>> experience and recent tests I can confirm that shutil.move() uses rename<br>>> on remote CIFS and NFS file systems.<br>>><br>>><br>>> _______________________________________________<br>>> Python-ideas mailing list<br>

>> <a href="mailto:Python-ideas@python.org" target="_blank">Python-ideas@python.org</a><br>>> <a href="http://mail.python.org/mailman/listinfo/python-ideas" target="_blank">http://mail.python.org/mailman/listinfo/python-ideas</a><br>
>><br>
> _______________________________________________<br>> Python-ideas mailing list<br>> <a href="mailto:Python-ideas@python.org" target="_blank">Python-ideas@python.org</a><br>> <a href="http://mail.python.org/mailman/listinfo/python-ideas" target="_blank">http://mail.python.org/mailman/listinfo/python-ideas</a><br>

</div>
</div></div></blockquote></div><br></div>