# -*- coding:UTF-8 -*-
import os
import os.path
import datetime
import stat
import shutil
import operator
# 文件全路径和对应最后修改时间写入到out.txt文档中;
def add_log(path):
with open('out.txt', 'w') as f:
f.close
for root, dirs, files in os.walk(path):
for name in files:
temp_path = os.path.join(root, name)
file_name = temp_path.replace('F:/build_log/', '')
file_time = os.stat(temp_path).st_mtime
with open('out.txt', 'a') as f:
f.write(','.join(['%s' % file_name, '%s' % file_time]))
f.close()
def if_exit():
# 判断文件out.txt是否存在,不存在则创建
filename = 'out.txt'
if os.path.exists(filename):
message = 'Ok, the "%s" file exists '
else:
message = "Sorry, I cannot find the '%s' file..and I create it."
a = open('out.txt', 'w')
a.close()
print(message % filename)
files_name = 'update'
if os.path.exists(files_name):
message = 'OK, the "%s" file exists.'
else:
message = "Sorry, I cannot find the '%s' file.and I create it. "
os.mkdir('update')
print(message % files_name)
# path 待比较的文件夹路径
# 返回生成的txt(包含更新或者添加的文件路径)的路径
def log_compare(path):
if_exit()
# 获取out.txt文件内容(文件全路径key和最后修改时间value),生成dict
txt = open('out.txt', 'r+').readlines
myDic = {}
for row in txt:
(key, value) = row.split(',')
myDic[key] = value
print(myDic)
# 创建以时间命名的文件和文件夹
setup_filename = str(datetime.datetime.now().strftime('%Y%m%d%H%M%S'))
setup_file_path = '%s%s.txt' % ('F:/Test_log/', setup_filename)
setup_file_dir = '%s%s' % ('F:/Test_log/', setup_file_path)
# 判断key,比较value值是否变化rs/
# 原始需要有一个out.txt文件,才能比较value确定是否有更新
# 运行程序时,重新遍历一遍文件全路径和最后修改时间
for root, dirs, files in os.walk(path):
for name in files:
temp_path = os.path.join(root, name)
file_name = temp_path.replace('F:/build_log/', '')
time = os.stat(temp_path).st_mtime # 获取最后的修改时间
file_time = '%s\n' % time
# 加%s\n是为了与out.txt里值完全对应
if file_name in myDic:
if operator.eq(myDic[file_time], file_time):
print(
file_name,
file_time,
)
with open(setup_file_path, 'a') as f:
f.write('%s\n' % file_name)
f.close()
else:
print('add', file_name)
with open(setup_file_path, 'a') as f:
f.write('%s\n' % file_name)
f.close()
return (setup_filename, setup_file_dir, setup_file_path)
# 将src目录中的内容拷贝到dest目录
# 如果dest或者其子目录不存在,先创建
# txt_path为更新日志路径,有更新的文件才拷贝
def copy_directory(src, dest, txt_path):
if not os.path.exists(txt_path):
print("no file update")
return
# 读更新日志,获取更新文件的全路径
txt = open(txt_path, 'r').readlines()
myDic = {}
myDic2 = {}
for row in txt:
myDic[row] = "1"
tempArray = os.path.split(row)
key = tempArray[0]
myDic2[key] = "1"
print("myDic2:", myDic2)
print("dict:", myDic)
# 遍历原始文件夹,得到所有文件的全路径
for root, dirs, files in os.walk(src):
for name in files:
# print "dirs:",dirs
fpath = os.path.join(root, name)
newroot = root
newroot = newroot.replace(src,
dest) # 根据文件绝对路径,创建将要拷贝的路径(相对路径),没有则创建
# print newroot
rel_dir = root.replace('F:/build_log/', '')
if not os.path.exists(newroot) and rel_dir in myDic2:
print("rel_dir:", rel_dir)
print(newroot)
os.makedirs(newroot)
os.chmod(newroot, stat.S_IWRITE)
temp = fpath
temp = temp.replace(src, dest)
rel_path = fpath.replace('F:/build_log/',
'') # 将绝对路径改为相对路径,便于遍历对比,挑出要拷贝的文件
rel_path += '\n'
if rel_path in myDic:
print("real_path:", rel_path)
# os.mkdir(rel_path)
shutil.copy(fpath, temp)
print("copyfile:", fpath)
def main():
path_dir = 'F:/build_log/'
params = log_compare(path_dir)
add_log(path_dir)
copy_directory(path_dir, params[1], params[2])
if __name__ == '__main__':
main()
运行出现错误