Rename file without overwriting existing files
steve+python at pearwood.info
Mon Jan 30 05:16:29 EST 2017
On Mon, 30 Jan 2017 03:33 pm, Cameron Simpson wrote:
> On 30Jan2017 13:49, Steve D'Aprano <steve+python at pearwood.info> wrote:
>>This code contains a Time Of Check to Time Of Use bug:
>> if os.path.exists(destination)
>> raise ValueError('destination already exists')
>> os.rename(oldname, destination)
>>In the microsecond between checking for the existence of the destination
>>and actually doing the rename, it is possible that another process may
>>create the destination, resulting in data loss.
>>Apart from keeping my fingers crossed, how should I fix this TOCTOU bug?
> For files this is a problem at the Python level. At the UNIX level you can
> play neat games with open(2) and the various O_* modes.
> however, with directories things are more cut and dry. Do you have much
> freedom here? What's the wider context of the question?
The wider context is that I'm taking from 1 to <arbitrarily huge number>
path names to existing files as arguments, and for each path name I
transfer the file name part (but not the directory part) and then rename
the file. For example:
may be renamed to:
but only provided ham.txt doesn't already exist.
“Cheer up,” they said, “things could be worse.” So I cheered up, and sure
enough, things got worse.
More information about the Python-list