普通程序
这里参考过往文章:【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方法继续监控。
这里相较于普通代码的优势有:
-
抽象:抽象允许你定义只包含基本特性和行为的类,而不必关心具体的实现细节。这可以帮助你更好地组织和理解复杂的系统,因为你可以将注意力集中在系统的高层次结构上,而不必陷入琐碎的细节中。
-
易于维护和修改:由于面向对象编程的封装、继承和多态等特性,使得代码更加模块化,从而更容易进行维护和修改。例如,你可以在不影响其他部分的情况下修改一个类的实现,或者添加新的功能。
-
代码重用性:在面向对象编程中,你可以创建可重用的对象。一旦你为某个对象定义了属性和方法,你就可以在程序的其他部分重复使用这个对象,而不必重新编写相同的代码。这可以大大提高编程效率,并减少代码冗余。
-
封装:封装是面向对象编程的核心概念之一,它隐藏了对象的内部状态并且控制了对其的访问。通过封装,你可以将数据和操作数据的方法结合在一起,形成一个自包含的单元。这提高了软件的安全性,因为你可以限制对对象内部状态的访问,防止其被外部代码随意修改。