Issue #22107: tempfile.gettempdir() and tempfile.mkdtemp() now try again

when a directory with the chosen name already exists on Windows as well as
on Unix.  tempfile.mkstemp() now fails early if parent directory is not
valid (not exists or is a file) on Windows.
This commit is contained in:
Serhiy Storchaka 2015-05-20 00:14:00 +03:00
commit 492f027793
3 changed files with 63 additions and 7 deletions

View file

@ -166,6 +166,13 @@ def _get_default_tempdir():
return dir
except FileExistsError:
pass
except PermissionError:
# This exception is thrown when a directory with the chosen name
# already exists on windows.
if (_os.name == 'nt' and _os.path.isdir(dir) and
_os.access(dir, _os.W_OK)):
continue
break # no point trying more names in this directory
except OSError:
break # no point trying more names in this directory
raise FileNotFoundError(_errno.ENOENT,
@ -204,7 +211,8 @@ def _mkstemp_inner(dir, pre, suf, flags):
except PermissionError:
# This exception is thrown when a directory with the chosen name
# already exists on windows.
if _os.name == 'nt':
if (_os.name == 'nt' and _os.path.isdir(dir) and
_os.access(dir, _os.W_OK)):
continue
else:
raise
@ -296,6 +304,14 @@ def mkdtemp(suffix="", prefix=template, dir=None):
return file
except FileExistsError:
continue # try again
except PermissionError:
# This exception is thrown when a directory with the chosen name
# already exists on windows.
if (_os.name == 'nt' and _os.path.isdir(dir) and
_os.access(dir, _os.W_OK)):
continue
else:
raise
raise FileExistsError(_errno.EEXIST,
"No usable temporary directory name found")