NovaBryan/EVE_Dump
Log | Files | 📦 下载最新源码 (.zip) | Refs | README

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