【Python】用面向对象的思想编写文件检测程序

普通程序

这里参考过往文章:【Python】检测指定文件夹下的文件是否修改

面向对象

完整代码如下:

import os
import time


class File_detection:
    obj = None

    def __init__(self, file_path):
        self.__file_path = file_path

    def __new__(cls, *args, **kwargs):  # 单例模式
        if not cls.obj:
            cls.obj = super().__new__(cls)
        return cls.obj

    def __get_file_name(self):
        files_name = os.listdir(self.__file_path)
        return files_name

    def __log_write(self, a, file_name=None):
        # 获取当前的时间戳
        timestamp = time.time()
        # 将时间戳转化为本地时间
        local_time = time.localtime(timestamp)
        formatted_time1 = time.strftime("%Y-%m-%d", local_time)
        formatted_time2 = time.strftime("%Y-%m-%d [%H:%M]", local_time)
        with open(f"{formatted_time1}.txt", "a", encoding="utf-8") as f:
            if a == 0:
                f.write(f"{formatted_time2} {self.__file_path}下文件变动,新增[{file_name}]\n")
            elif a == 1:
                f.write(f"{formatted_time2} {self.__file_path}下文件变动,减少[{file_name}]\n")
            elif a == 2:
                f.write(f"{formatted_time2} {self.__file_path}下文件变动,更改[{file_name}]\n")

    def detection(self):
        file_number = 0
        f1_time = {}
        file1_names = self.__get_file_name()
        for f1 in file1_names:
            f1_time[f1] = os.stat(self.__file_path + fr'\{f1}')
        while True:
            file2_names = self.__get_file_name()
            if len(file2_names) < len(file1_names):
                for f1 in file1_names:
                    if f1 not in file2_names:
                        self.__log_write(1, f1)
                        file_number += 1
                        break
            elif len(file2_names) >= len(file1_names):
                for f2 in file2_names:
                    if f2 not in file1_names:
                        self.__log_write(0, f2)
                        file_number += 1
                        break
                    elif f2 in file1_names and os.stat(self.__file_path + fr'\{f2}') != f1_time[f2]:
                        self.__log_write(2, f2)
                        file_number += 1
                        break
            if file_number != 0:
                break
        if file_number != 0:
            self.detection()


if "__main__" == __name__:
    file = File_detection(r"/")
    file.detection()

日志文件

以下是日志文件生成的效果图
日志文件

代码解析

  • 类中的__init__(self, file_path):初始化方法,接收一个参数file_path,表示要监控的目录。
  • 类中的__new__(cls, *args, **kwargs):单例模式方法,如果cls.obj为空,则创建一个新的实例,否则返回cls.obj。
  • 类中的__get_file_name(self):获取目录下所有文件的文件名。
  • 类中的__log_write(self, a, file_name=None):用于记录日志,根据参数a的不同,记录不同的日志信息。
  • detection(self):监控文件变动的主要方法。首先获取目录下所有文件的文件名,然后进入无限循环,不断获取当前目录下所有文件名,与上一次获取的文件名进行比较,判断是否有文件增加、减少或更改,根据不同情况记录日志。

在detection方法中,通过比较两次获取的文件名数量来判断是否有文件增加或减少。如果有文件增加或减少,则调用__log_write方法记录日志,同时增加file_number计数器。在比较文件名时,如果发现有文件名在两次获取的文件名中都不存在,则说明该文件已被删除,同样调用__log_write方法记录日志。如果发现有文件名在第一次获取的文件名中不存在,但在第二次获取的文件名中存在,则说明该文件已被创建。对于文件的更改,通过比较两次获取的文件状态来判断。如果发现文件状态不一致,则调用__log_write方法记录日志。

如果file_number不为0,则说明有文件变动发生,退出循环。如果file_number为0,则说明没有文件变动发生,再次执行循环。如果循环结束后file_number不为0,则说明有文件变动发生,调用detection方法继续监控。

这里相较于普通代码的优势有:

  • 抽象:抽象允许你定义只包含基本特性和行为的类,而不必关心具体的实现细节。这可以帮助你更好地组织和理解复杂的系统,因为你可以将注意力集中在系统的高层次结构上,而不必陷入琐碎的细节中。

  • 易于维护和修改:由于面向对象编程的封装、继承和多态等特性,使得代码更加模块化,从而更容易进行维护和修改。例如,你可以在不影响其他部分的情况下修改一个类的实现,或者添加新的功能。

  • 代码重用性:在面向对象编程中,你可以创建可重用的对象。一旦你为某个对象定义了属性和方法,你就可以在程序的其他部分重复使用这个对象,而不必重新编写相同的代码。这可以大大提高编程效率,并减少代码冗余。

  • 封装:封装是面向对象编程的核心概念之一,它隐藏了对象的内部状态并且控制了对其的访问。通过封装,你可以将数据和操作数据的方法结合在一起,形成一个自包含的单元。这提高了软件的安全性,因为你可以限制对对象内部状态的访问,防止其被外部代码随意修改。

  • 18
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值