copyfile avoiding overwrites and race conditions
Larry Bates
larry.bates at websafe.com
Mon Jun 19 09:57:49 EDT 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