Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2074
  • 博文数量: 1
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 20
  • 用 户 组: 普通用户
  • 注册时间: 2011-05-21 13:28
文章分类
文章存档

2013年(1)

我的朋友
最近访客

分类: Python/Ruby

2013-09-24 16:34:03

完全兼容系统cp特性
支持文件和目录断点续传,显示速度,进度,大小等等信息。
可用来
替换系统cp。




代码如下(python)

点击(此处)折叠或打开

  1. #!/usr/bin/python
  2. #coding:u8

  3. #-------------------------------------------------------------------------------
  4. # Name: mcp
  5. # Created: 02/09/2013
  6. # Copyright: (c) xk 2013
  7. #-------------------------------------------------------------------------------

  8. import os
  9. import sys
  10. import re
  11. import platform
  12. import time


  13. class Mfile(object):
  14.     def __init__(self,pfile,mode):
  15.         self.file_dir = os.path.dirname(pfile)
  16.         self.file_name = os.path.basename(pfile)
  17.         self.file_path = os.path.abspath(pfile)
  18.         self.file_mode = mode
  19.         self.file_md5 = 'md5'

  20.         self.file_uptime = 0
  21.         self.file_uptime_size = 0

  22.         if os.path.isfile(pfile):
  23.             self.file_size = os.path.getsize(pfile)
  24.         else:
  25.             self.file_size = 0

  26.         if self.file_size > 2000:
  27.             self.file_get_size = self.file_size - 1000
  28.             self.file_buffer_size = 1000
  29.         else:
  30.             self.file_get_size = self.file_size
  31.             self.file_buffer_size = self.file_size

  32.         try:
  33.             self.file_open=open(self.file_path,self.file_mode)
  34.         except Exception,e:
  35.             open_status=1
  36.             print e
  37.             sys.exit()

  38.     def move_tell(self,number):
  39.         pass

  40.     def __del__(self):
  41.         pass


  42. def fcp(s , d , show_size_on = 0 ):

  43.     c=10485760
  44.     sfile = Mfile(s,'rb')
  45.     dfile = Mfile(d,'ab+')

  46.     #修正指针偏移
  47.     if sfile.file_size != 0:
  48.         if (sfile.file_size != dfile.file_size) and ( dfile.file_size != 0):

  49.             dfile.file_open.seek(dfile.file_get_size,0)
  50.             sfile.file_open.seek(dfile.file_get_size,0)

  51.             if dfile.file_open.read(dfile.file_buffer_size) == sfile.file_open.read(dfile.file_buffer_size):
  52.                 sfile.file_open.seek(dfile.file_size,0)
  53.                 dfile.file_open.seek(0,2)

  54.             elif( 'yes' == raw_input('overwrite '+dfile.file_name+' [yes/no]:') ):
  55.                 dfile.file_open.close()
  56.                 dfile=Mfile(d,'wb+')
  57.                 sfile.file_open.seek(0,0)
  58.             else:
  59.                 sfile.file_open.seek(0,2)
  60.                 dfile.file_open.seek(0,2)

  61.         elif sfile.file_size == dfile.file_size :
  62.             print 'File exists:',dfile.file_path,
  63.             sfile.file_open.seek(0,2)

  64.     #开始复制
  65.     dfile.file_uptime=time.time()
  66.     dfile_tell = sfile.file_open.tell()
  67.     if ( sfile.file_size == 0 ):
  68.         print (sfile.file_name)+' '*(50 - len(sfile.file_name)),'100% ['+ ('*'*50) +'] 0.0MB/s | 0.0KB'
  69.     else:
  70.         while(sfile.file_open.tell() != sfile.file_size ):
  71.             buffer=sfile.file_open.read(c)
  72.             dfile.file_open.write(buffer)
  73.             
  74.             if ( show_size_on == 1 ):
  75.                 dfile.file_uptime_size = ( sfile.file_open.tell() - dfile_tell ) / (time.time() - dfile.file_uptime)
  76.                 show_size( sfile.file_size , sfile.file_open.tell() , dfile.file_name , dfile.file_uptime_size)
  77.                 #time.sleep(0.2)
  78.         else:
  79.             print ''

  80.     del sfile
  81.     del dfile



  82. def dcp(s,d,jc=0,mshow=0):
  83.     s = os.path.abspath(s)
  84.     d = os.path.abspath(d)

  85.     if ( s == d ) or ( s == d+'/'+os.path.basename(s) ):
  86.         print 'cp :','\''+s+'\'','and','\''+d+'\'',': are the same file'
  87.         sys.exit()

  88.     #文件
  89.     elif os.path.isfile(s):
  90.         if os.path.isfile(d):
  91.             fcp(s,d, show_size_on = mshow)
  92.         elif os.path.isdir(d):
  93.             d = d+'/'+os.path.basename(s)
  94.             fcp(s,d, show_size_on = mshow)    
  95.         elif os.path.isdir( os.path.dirname(d)):
  96.             fcp(s,d, show_size_on = mshow)    
  97.         else:
  98.             print 'Not found file:',d

  99.     #目录递归
  100.     elif os.path.isdir(s) :
  101.         if (os.path.isfile(d)):
  102.             print 'cp :','\''+s+'\'','and','\''+d+'\'',': are the same file'
  103.             sys.exit()
  104.         elif not os.access(s,os.R_OK):
  105.             print d,': Permission denied'
  106.             sys.exit()
  107.         elif s in d:
  108.             print '\''+s+'\'','to','\''+d+'\'',": File error"
  109.             sys.exit()
  110.         #确定目标文件夹根路径(只调用一次)
  111.         elif ( jc == 0 ):
  112.             jc += 1
  113.             if os.path.isdir(d):
  114.                 d = d+'/'+ os.path.basename(s)

  115.         if os.path.isdir( os.path.dirname(d)):
  116.             if not os.path.isdir(d):
  117.                 os.mkdir(d)
  118.         else:
  119.             print 'Not found :',os.path.dirname(d)
  120.             sys.exit()

  121.         for x in os.listdir(s):
  122.                 dcp(s+'/'+x ,d+'/'+x , jc ,mshow = mshow )

  123.     elif not os.path.exists(s):
  124.         print s,': No such file or directory'



  125. def show_size(total_size , tail_size , filename , minute_size):
  126.     filename = (filename)+' '*(50 - len(filename))

  127.     #百分比
  128.     if ( tail_size != total_size ):
  129.         rate = (float(tail_size) / float(total_size) * 100)
  130.         rate_sum = '%d%s' % (rate,'%')
  131.     else:
  132.         rate_sum = str(100)+'%'

  133.     #进度条
  134.     jd_size = '*' * (int(float(tail_size) / float(total_size) * 50))
  135.     jd_size = '[%s%s]' % (jd_size , (' ' * (50 - len(jd_size))))

  136.     #速度
  137.     i=0
  138.     #minute_size = minute_size / 2
  139.     while ( minute_size >= 1024 and i <= 2):
  140.         minute_size = float(minute_size) / float(1024)
  141.         i = i + 1
  142.     else:
  143.         if i == 0:
  144.             minute_size = str(round(minute_size,1)) + 'k/s'
  145.         elif i == 1:
  146.             minute_size = str(round(minute_size,1)) + 'kB/s'
  147.         elif i == 2:
  148.             minute_size = str(round(minute_size,1)) + 'MB/s'
  149.     minute_size = '%s%s' % ( minute_size , ( ' ' * (10 - len(str(minute_size)) )))

  150.     #已经复制大小
  151.     i=0
  152.     while ( tail_size >= 1024 and i < 2):
  153.         tail_size = float(tail_size) / float(1024)
  154.         i = i+1
  155.     else:
  156.         if i == 0 :
  157.             tail_size = str(round(tail_size))+'K'
  158.         elif i == 1:
  159.             tail_size = str(round(tail_size))+'KB'
  160.         elif i == 2:
  161.             tail_size = str(round(tail_size))+'M'

  162.     print '\r',filename , rate_sum , jd_size , minute_size , '|' , tail_size, ' ',
  163.     sys.stdout.flush()



  164. if __name__ == '__main__':
  165.     sys_type=platform.system()

  166.     if ( sys_type == 'Windows'):
  167.         sfile=raw_input('source File:')
  168.         dfile=raw_input('destination File:')

  169.         try:
  170.             dcp(sfile,dfile)
  171.         except KeyboardInterrupt:
  172.             sys.exit()
  173.         os.system('pause')

  174.     else:
  175.         filelist=[]
  176.         for x in sys.argv[1:]:
  177.             if not re.match('-(.*)$', x):
  178.                 filelist.append(x)
  179.         if ( len(filelist) == 2 ):

  180.             try:
  181.                 dcp( filelist[0] , filelist[1] , mshow = 1)
  182.             except KeyboardInterrupt:
  183.                 sys.exit()
  184.         else:
  185.             print '[ERROR]'
  186.             print ' example :[ cp sfile dfile ]'

阅读(230) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:没有了

给主人留下些什么吧!~~