Safely renaming a file without overwriting

Wolfgang Draxinger wdraxinger at darkstargames.de
Sat Oct 28 07:38:14 EDT 2006


Steven D'Aprano wrote:

> I want to rename a file, but only if the destination file name
> doesn't already exist.
> 
> I can do this:
> 
> if os.path.exists(dest):
>     # skip file, raise an exception, make a backup...
>     do_something_else()
> else:
>     os.rename(src, dest)
> 
> 
> But on a multi-user system, it is possible that dest is created
> in the time period between checking if it exists and attempting
> the rename.
> 
> Is there any way to prevent this? Or do I just try to keep the
> check and the rename as close together as possible, minimizing
> the chances and hoping for the best?

1: Open the file with os.open

2: Lock the file exclusively -> no other process can now access
it.

3: Use rename to rename the file; this causes a file system level
implicit unlink of the old file (it dissappears from the file
system) but the opening process can still access it.

4: close the file -> the lock is removed and the rename
finalized.

Wolfgang Draxinger
-- 
E-Mail address works, Jabber: hexarith at jabber.org, ICQ: 134682867
GPG key FP: 2FC8 319E C7D7 1ADC 0408 65C6 05F5 A645 1FD3 BD3E



More information about the Python-list mailing list