diff options
author | Serhiy Storchaka <storchaka@gmail.com> | 2015-05-19 21:11:48 (GMT) |
---|---|---|
committer | Serhiy Storchaka <storchaka@gmail.com> | 2015-05-19 21:11:48 (GMT) |
commit | 5d6b7b1cb7943255b8682ea3663ce2c0da500e96 (patch) | |
tree | 49a4de50e3e055cfacbb599523456d5a70c2d7a0 /Lib/tempfile.py | |
parent | f6d1f1fa8a503f218a2103ba1e6768c6cfdb7c50 (diff) | |
download | cpython-5d6b7b1cb7943255b8682ea3663ce2c0da500e96.zip cpython-5d6b7b1cb7943255b8682ea3663ce2c0da500e96.tar.gz cpython-5d6b7b1cb7943255b8682ea3663ce2c0da500e96.tar.bz2 |
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.
Diffstat (limited to 'Lib/tempfile.py')
-rw-r--r-- | Lib/tempfile.py | 18 |
1 files changed, 17 insertions, 1 deletions
diff --git a/Lib/tempfile.py b/Lib/tempfile.py index a2764d3..0537228 100644 --- a/Lib/tempfile.py +++ b/Lib/tempfile.py @@ -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") |