copyfile avoiding overwrites and race conditions

Larry Bates larry.bates at websafe.com
Mon Jun 19 15:57:49 CEST 2006


manuelg at gmail.com wrote:
> Here is a code fragment, where I am trying to copy a file, avoiding
> overwrites and race conditions.  The filename gets a '02','03','04' etc
> appended to the end if a file with that name already exists.
> 
> I know the writing of the single space is overkill, but I am surprised
> I cannot find an example of this floating around the web and newsgroups
> 
> my understanding of 'os.open' and 'os.fdopen' is minimal
> 
> ## start fragment
> 
>     i = 0
>     while True:
> 
>         if i >= 100: raise RanOutFileNamesError(fullpath)
>         i += 1
> 
>         if i > 1:
>             name0 = '%s_%02i%s' % (suggested_name, i, file_extension)
>         else:
>             assert i == 1
>             name0 = '%s%s' % (suggested_name, file_extension)
>         fullpath = os.path.join(path0, name0)
> 
>         # create dummy file, force overwrite
> 
>         try:
>             fd = os.open(
>                 fullpath,
>                 os.O_CREAT | os.O_EXCL | os.O_WRONLY)
>         except OSError:
>             continue
> 
>         # is this really necessary?
>         file = os.fdopen(fd, "w")
>         file.write(' ')
>         file.close()
> 
>         shutil.copyfile(original_filepath, fullpath)
> 
>         return fullpath
> 
> ## end fragment
> 
I guess my approach would be different.  To eliminate any race
conditions, I would keep a small text file that always contained
the next filename that is to be written.  Something like:

nextfiletowrite=/path/filename006.dat

I would try to get a lock on this file, read it, extract next
filename, increment the counter portion of the filename,
write it back out and unlock it.  Now I have the name of the
file to write that is unique to my instance and I can write it
without worrying about other processes.

Hope this helps.

-Larry Bates



More information about the Python-list mailing list