posixemulation.py (2638B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\carbon\common\lib\werkzeug\posixemulation.py 2 import os 3 import errno 4 import time 5 import random 6 can_rename_open_file = False 7 if os.name == 'nt': 8 _rename = lambda src, dst: False 9 _rename_atomic = lambda src, dst: False 10 try: 11 import ctypes 12 _MOVEFILE_REPLACE_EXISTING = 1 13 _MOVEFILE_WRITE_THROUGH = 8 14 _MoveFileEx = ctypes.windll.kernel32.MoveFileExW 15 16 def _rename(src, dst): 17 if not isinstance(src, unicode): 18 src = unicode(src, sys.getfilesystemencoding()) 19 if not isinstance(dst, unicode): 20 dst = unicode(dst, sys.getfilesystemencoding()) 21 if _rename_atomic(src, dst): 22 return True 23 retry = 0 24 rv = False 25 while not rv and retry < 100: 26 rv = _MoveFileEx(src, dst, _MOVEFILE_REPLACE_EXISTING | _MOVEFILE_WRITE_THROUGH) 27 if not rv: 28 time.sleep(0.001) 29 retry += 1 30 31 return rv 32 33 34 _CreateTransaction = ctypes.windll.ktmw32.CreateTransaction 35 _CommitTransaction = ctypes.windll.ktmw32.CommitTransaction 36 _MoveFileTransacted = ctypes.windll.kernel32.MoveFileTransactedW 37 _CloseHandle = ctypes.windll.kernel32.CloseHandle 38 can_rename_open_file = True 39 40 def _rename_atomic(src, dst): 41 ta = _CreateTransaction(None, 0, 0, 0, 0, 1000, 'Werkzeug rename') 42 if ta == -1: 43 return False 44 try: 45 retry = 0 46 rv = False 47 while not rv and retry < 100: 48 rv = _MoveFileTransacted(src, dst, None, None, _MOVEFILE_REPLACE_EXISTING | _MOVEFILE_WRITE_THROUGH, ta) 49 if rv: 50 rv = _CommitTransaction(ta) 51 break 52 else: 53 time.sleep(0.001) 54 retry += 1 55 56 return rv 57 finally: 58 _CloseHandle(ta) 59 60 61 except Exception: 62 pass 63 64 def rename(src, dst): 65 if _rename(src, dst): 66 return 67 try: 68 os.rename(src, dst) 69 except OSError as e: 70 if e.errno != errno.EEXIST: 71 raise 72 old = '%s-%08x' % (dst, random.randint(0, sys.maxint)) 73 os.rename(dst, old) 74 os.rename(src, dst) 75 try: 76 os.unlink(old) 77 except Exception: 78 pass 79 80 81 else: 82 rename = os.rename 83 can_rename_open_file = True