美文网首页Python新世界
删库跑路?在我这里永远不可能!我有自动备份文件的程序!

删库跑路?在我这里永远不可能!我有自动备份文件的程序!

作者: 919b0c54458f | 来源:发表于2018-12-25 14:02 被阅读2次

    该程序包含以下个文件:

    进群:960410445  即可获取数十套PDF!

    Sync.py:主程序

    Sync1.ini:配置文件

    Logger1.py:记录器支持的模块

    Sync.log是sync.py创建的文件。

    现在让我们了解sync.py的代码,看看它是如何工作的。

    1.导入要使用的基本库。

    Import configparser.

    Import time.

    Import shutil.

    Import hashlib.

    From the distutils.dir_util import copy_tree.

    From the collections, import OrderedDict.

    Import the OS.

    Import logger1 as log1.

    以下代码为读取Sync1.ini文件:

    def ConfRead():

    config = configparser.ConfigParser()

    config.read(“Sync1.ini”)

    return (dict(config.items(“Para”)))

    下面显示的是从Sync.ini文件中获得的一些变量:

    All_Config = ConfRead()

    Freq = int(All_Config.get(“freq”))*60

    Total_time = int(All_Config.get(“total_time”))*60

    repeat = int(Total_time/Freq)

    图1:使用pyinstaller创建一个exe文件

    图2:将exe文件放在Windows文件夹中

    以下函数md5用于计算文件的哈希值。如果修改文件,则名称保持不变,但哈希值会更改。

    def md5(fname,size=4096):

    hash_md5 = hashlib.md5()

    with open(fname, “rb”) as f:

    for chunk in iter(lambda: f.read(size), b””):

    hash_md5.update(chunk)

    return hash_md5.hexdigest()

    以下函数使用中介复制整个目录:

    def CopyDir(from1, to):

    copy_tree(from1, to)

    以下函数只将一个文件复制到目标位置:

    def CopyFiles(file, path_to_copy):

    shutil.copy(file,path_to_copy)

    图3:CMD默认路径

    图4:同步命令

    以下函数创建一个字典,其中包含带有文件哈希的文件名。该函数获取源位置并生成所有文件的字典:

    def OriginalFiles():

    drive = All_Config.get(“from”)

    Files_Dict = OrderedDict()

    print (drive)

    for root, dir, files in os.walk(drive, topdown=True):

    for file in files:

    file = file.lower()

    file_path = root+’\’+file

    try:

    hash1 = md5(file_path,size=4096)

    #modification_time = int(os.path.getmtime(file_path))

    rel_path = file_path.strip(drive)

    Files_Dict[(hash1,rel_path)]= file_path

    except Exception as e :

    log1.logger.error(‘Error Original files: {0}’.format(e))

    return Files_Dict

    以下的函数创建一个字典,其中包含带有文件哈希的文件名。该函数获取目标位置并获取所有当前文件并生成字典。如果根文件夹不存在,则调用CopyDir函数。

    def Destination():

    Files_Dict = OrderedDict()

    from1 = All_Config.get(“from”)

    to= All_Config.get(“to”)

    dir1= from1.rsplit(“\”,1)[1]

    drive = to+dir1

    #print (drive)

    try:

    if os.path.isdir(drive):

    for root, dir, files in os.walk(drive, topdown=True):

    for file in files:

    file = file.lower()

    file_path = root+’\’+file

    try:

    hash1 = md5(file_path,size=4096)

    #modification_time = int(os.path.getmtime(file_path))

    rel_path = file_path.strip(drive)

    Files_Dict[(hash1,rel_path)]= file_path

    except Exception as e :

    log1.logger.error(‘Error Destination foor loop: {0}’.format(e))

    return Files_Dict

    else :

    CopyDir(from1,drive)

    log1.logger.info(‘Full folder: {0} copied’.format(from1))

    return None

    except Exception as e :

    log1.logger.error(‘Error Destination: {0}’.format(e))

    以下函数定义如下逻辑:

    如果已使用文件夹创建文件。

    如果文件已被修改。

    图5:复制完整文件夹

    图6:修改文件后

    在这两种情况下,下面的代码只是比较原始字典和目标字典。如果创建或修改了任何文件,则解释器将从源复制文件并将其粘贴到目标中。

    def LogicCompare():

    from1 = All_Config.get(“from”)

    to= All_Config.get(“to”)

    Dest_dict = Destination()

    if Dest_dict:

    Source_dict = OriginalFiles()

    remaining_files = set(Source_dict.keys())- set(Dest_dict.keys())

    remaining_files= [Source_dict.get(k) for k in remaining_files]

    for file_path in remaining_files:

    try:

    log1.logger.info(‘File: {0}’.format(file_path))

    dir, file = file_path.rsplit(“\”,1)

    rel_dir = from1.rsplit(“\”,1)[1]

    rel_dir1 = dir.replace(from1,””)

    dest_dir = to+rel_dir+”\”+rel_dir1

    if not os.path.isdir(dest_dir):

    os.makedirs(dest_dir)

    CopyFiles(file_path, dest_dir)

    except Exception as e:

    log1.logger.error(‘Error LogicCompare: {0}’.format(e))

    下面的代码使用循环来反复运行代码:

    i = 0

    while True:

    if i >= repeat:

    break

    LogicCompare()

    time.sleep(Freq)

    i = i +1

    来看Sync1.ini的文件内容:

    [Para]

    From = K: esting1

    To = E:

    Freq = 1

    Total_time = 5

    在上面的代码中:

    From:指定源目录并获取testing1文件夹的备份。

    To:指定备份的位置。

    Freq:在指定多少分钟后进行备份。

    Total_time:运行Total_time分钟的代码时长。

    我们来看看logger1.py的代码:

    import logging

    logger = logging.getLogger(“Mohit”)

    logger.setLevel(logging.INFO)

    fh = logging.FileHandler(“Sync.log”)

    formatter = logging.Formatter(‘%(asctime)s - %(levelname)s - %(message)s’)

    fh.setFormatter(formatter)

    logger.addHandler(fh)

    上面的代码非常简单,可以在INFO模式下使用。

    如果你不想使用解释器来运行代码,可以创建一个Windows exe文件,这将作为命令。转换它可以用pyinstaller,我已经安装了那个模块。

    图1中的命令将您的代码转换为exe文件,运行它不需要Python解释器。

    图7:创建新文件后

    图8:笔驱动器存在时的输出

    如何运行该程序

    执行如图1所示的命令后,检查名为Sync的文件夹。在此文件夹中,检查名为dist的文件夹,您将在其中获取.exe文件。现在复制此.exe文件并将其粘贴到C:/ Windows文件夹中,如图2所示。

    现在打开命令提示符。检查当前文件夹,如图3所示。在我的PC中,默认提示路径为c:/ user / Mohit。在您的PC中,它可能会有所不同。因此,复制Sync1.ini文件并将其粘贴到c:/ user / <your-name>文件夹中。

    现在插上外接笔式驱动器。检查笔式驱动器盘符,它在我的PC中是E.

    根据您的PC配置,更改放置在C:/ user / <your-name>目录中的Sync1.ini参数。

    现在打开命令提示符并键入命令,如图4所示。

    现在检查你的驱动器,查看sync.log,它是在文件夹c:/ user / <your-name>中被创建的。

    有四种情况可能:

    当驱动器中没有整个文件夹时(图5)。

    修改现有文件时(图6)。

    创建新文件时(图7)。

    最后一种情况是当笔驱动器不存在时的负面测试案例(图8)。

    相关文章

      网友评论

        本文标题:删库跑路?在我这里永远不可能!我有自动备份文件的程序!

        本文链接:https://www.haomeiwen.com/subject/thlflqtx.html