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

file_util.py (4668B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\carbon\common\stdlib\distutils\file_util.py
      2 __revision__ = '$Id: file_util.py 87602 2011-01-01 04:24:26Z richard.tew $'
      3 import os
      4 from distutils.errors import DistutilsFileError
      5 from distutils import log
      6 _copy_action = {None: 'copying',
      7  'hard': 'hard linking',
      8  'sym': 'symbolically linking'}
      9 
     10 def _copy_file_contents(src, dst, buffer_size = 16384):
     11     fsrc = None
     12     fdst = None
     13     try:
     14         try:
     15             fsrc = open(src, 'rb')
     16         except os.error as (errno, errstr):
     17             raise DistutilsFileError("could not open '%s': %s" % (src, errstr))
     18 
     19         if os.path.exists(dst):
     20             try:
     21                 os.unlink(dst)
     22             except os.error as (errno, errstr):
     23                 raise DistutilsFileError("could not delete '%s': %s" % (dst, errstr))
     24 
     25         try:
     26             fdst = open(dst, 'wb')
     27         except os.error as (errno, errstr):
     28             raise DistutilsFileError("could not create '%s': %s" % (dst, errstr))
     29 
     30         while 1:
     31             try:
     32                 buf = fsrc.read(buffer_size)
     33             except os.error as (errno, errstr):
     34                 raise DistutilsFileError("could not read from '%s': %s" % (src, errstr))
     35 
     36             if not buf:
     37                 break
     38             try:
     39                 fdst.write(buf)
     40             except os.error as (errno, errstr):
     41                 raise DistutilsFileError("could not write to '%s': %s" % (dst, errstr))
     42 
     43     finally:
     44         if fdst:
     45             fdst.close()
     46         if fsrc:
     47             fsrc.close()
     48 
     49 
     50 def copy_file(src, dst, preserve_mode = 1, preserve_times = 1, update = 0, link = None, verbose = 1, dry_run = 0):
     51     from distutils.dep_util import newer
     52     from stat import ST_ATIME, ST_MTIME, ST_MODE, S_IMODE
     53     if not os.path.isfile(src):
     54         raise DistutilsFileError("can't copy '%s': doesn't exist or not a regular file" % src)
     55     if os.path.isdir(dst):
     56         dir = dst
     57         dst = os.path.join(dst, os.path.basename(src))
     58     else:
     59         dir = os.path.dirname(dst)
     60     if update and not newer(src, dst):
     61         if verbose >= 1:
     62             log.debug('not copying %s (output up-to-date)', src)
     63         return (dst, 0)
     64     try:
     65         action = _copy_action[link]
     66     except KeyError:
     67         raise ValueError("invalid value '%s' for 'link' argument" % link)
     68 
     69     if verbose >= 1:
     70         if os.path.basename(dst) == os.path.basename(src):
     71             log.info('%s %s -> %s', action, src, dir)
     72         else:
     73             log.info('%s %s -> %s', action, src, dst)
     74     if dry_run:
     75         return (dst, 1)
     76     if link == 'hard':
     77         if not (os.path.exists(dst) and os.path.samefile(src, dst)):
     78             os.link(src, dst)
     79     elif link == 'sym':
     80         if not (os.path.exists(dst) and os.path.samefile(src, dst)):
     81             os.symlink(src, dst)
     82     else:
     83         _copy_file_contents(src, dst)
     84         if preserve_mode or preserve_times:
     85             st = os.stat(src)
     86             if preserve_times:
     87                 os.utime(dst, (st[ST_ATIME], st[ST_MTIME]))
     88             if preserve_mode:
     89                 os.chmod(dst, S_IMODE(st[ST_MODE]))
     90     return (dst, 1)
     91 
     92 
     93 def move_file(src, dst, verbose = 1, dry_run = 0):
     94     from os.path import exists, isfile, isdir, basename, dirname
     95     import errno
     96     if verbose >= 1:
     97         log.info('moving %s -> %s', src, dst)
     98     if dry_run:
     99         return dst
    100     if not isfile(src):
    101         raise DistutilsFileError("can't move '%s': not a regular file" % src)
    102     if isdir(dst):
    103         dst = os.path.join(dst, basename(src))
    104     elif exists(dst):
    105         raise DistutilsFileError("can't move '%s': destination '%s' already exists" % (src, dst))
    106     if not isdir(dirname(dst)):
    107         raise DistutilsFileError("can't move '%s': destination '%s' not a valid path" % (src, dst))
    108     copy_it = 0
    109     try:
    110         os.rename(src, dst)
    111     except os.error as (num, msg):
    112         if num == errno.EXDEV:
    113             copy_it = 1
    114         else:
    115             raise DistutilsFileError("couldn't move '%s' to '%s': %s" % (src, dst, msg))
    116 
    117     if copy_it:
    118         copy_file(src, dst, verbose=verbose)
    119         try:
    120             os.unlink(src)
    121         except os.error as (num, msg):
    122             try:
    123                 os.unlink(dst)
    124             except os.error:
    125                 pass
    126 
    127             raise DistutilsFileError(("couldn't move '%s' to '%s' by copy/delete: " + "delete '%s' failed: %s") % (src,
    128              dst,
    129              src,
    130              msg))
    131 
    132     return dst
    133 
    134 
    135 def write_file(filename, contents):
    136     f = open(filename, 'w')
    137     try:
    138         for line in contents:
    139             f.write(line + '\n')
    140 
    141     finally:
    142         f.close()