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