日期:2023年7月17日
作者:Commas
签名:(ง •_•)ง 积跬步以致千里,积小流以成江海……
注释:如果您觉得有所帮助,帮忙点个赞,也可以关注我,我们一起成长;如果有不对的地方,还望各位大佬不吝赐教,谢谢^ - ^
1.01365 = 37.7834;0.99365 = 0.0255
1.02365 = 1377.4083;0.98365 = 0.0006


文章目录

  • 一、精彩回顾
  • 二、前言
  • 二、第三方监听目录变化库
    • (1)Watchdog库
    • (2)Pyinotify库
    • (3)Gamin库
    • (4)PyFilesystem2库
  • 三、监听目录取消文件只读
    • (1)首先,安装watchdog库
    • (2)取消文件只读属性
    • (3)事件处理器对象
    • (4)观察者对象
  • 四、最终实现的代码


一、精彩回顾

《Python学习的奇妙之旅》
《python3遍历目录的三种方法浅谈》
《python设置文件只读与取消文件只读》
《Python读取文件的三种方式》

二、前言

通过新版微信接收的文件都被修改了权限,文件均被设置为“只读”。或许这对于微信来说是挺安全的,但是却给我们带来了不少的麻烦,想修改点东西,必须先取消文件只读属性,否者无法保存。

前段时间写过关于文件权限的文章(《python设置文件只读与取消文件只读》,结合目录遍历的知识(《python3遍历目录的三种方法浅谈》),再加个定时器不断遍历 微信接收文件的目录 ,确实可以解决问题,但不是本文所要讲解的,感兴趣的小伙伴可以自行尝试下。

虽然微信版本在持续更新,但是“文件被设为只读”的行为却没有更改,看来只能用程序打败程序,监听微信接收文件的目录,接收一个文件就处理一个文件的方式,去解决文件只读的问题。

二、第三方监听目录变化库

Python 的标准库中,没有直接用于监听文件目录变化的内置模块。有几个流行的第三方库可以用于监听文件目录的变化,如下:

(1)Watchdog库

Watchdog 是一个功能强大且易于使用的库,提供了监视文件和目录变化的功能。它支持各种事件,如文件创建、修改、删除等,并可以在这些事件发生时执行自定义的回调函数。Watchdog库在 Python 社区中广泛使用,并且有良好的文档和示例代码。

(2)Pyinotify库

Pyinotify 是一个与 Linux 内核中的 inotify 机制集成的库,可以高效地监视文件和目录的变化。它提供了 PythonicAPI,可以轻松地处理文件事件。Pyinotify 对于需要在Linux平台上进行文件监控的任务非常有用。

(3)Gamin库

Gamin 是另一个用于文件监控的库,它使用 Linux 上的 Gamin 守护进程作为后端。Gamin 库提供了一个简单的接口来监视文件和目录的变化,并可以触发相应的事件。

(4)PyFilesystem2库

PyFilesystem2 是一个通用的文件系统抽象库,它可以处理各种文件系统和存储。虽然它的主要目的是提供一个统一的 API 来访问不同类型的文件系统,但它也具有监视文件变化的功能。

三、监听目录取消文件只读

为了简化开发,这里打算采用第三方库 watchdog 来实现我们的需求。

(1)首先,安装watchdog库

pip install watchdog

如果不想污染全局库,想安装在虚拟环境中,可以这样做:

  • 首先,创建一个虚拟环境 chmod_watchdogvirtualenv chmod_watchdog
  • 其次,激活z虚拟环境,\chmod_watchdog\Scripts\activate
  • 接着,安装 watchdog 库,pip install watchdog
  • 完成工作并想要退出虚拟环境,\chmod_watchdog\Scripts\deactivate

(2)取消文件只读属性

  • 判断文件是否只读
def is_file_read_only(file_path):if os.access(file_path, os.W_OK):# 如果文件或目录具有指定的权限,返回True。return Falseelse:# 如果文件或目录不具有指定的权限,# 或者检查过程中发生错误,返回False。return True
  • 取消文件的只读属性
def unset_file_read_only(file_path):# 获取当前文件的权限标志位file_stat = os.stat(file_path)# 取消只读属性,将其权限更改为可写new_mode = file_stat.st_mode | stat.S_IWUSR# 设置新的权限标志位os.chmod(file_path, new_mode)

(3)事件处理器对象

  • 创建事件处理器对象
class MyEventHandler(FileSystemEventHandler):def on_any_event(self, event):if event.is_directory:  # 忽略文件夹的变化returnif event.event_type == 'created' or event.event_type == 'modified':  # 只处理新建和修改事件file_path = event.src_pathremove_read_only(file_path)event_handler = MyEventHandler()
  • 取消文件只读属性,函数会在文件变化时被调用
def remove_read_only(file_path):# file_path 参数是变化的文件路径print("文件已变化:", file_path)# 判断文件是否只读if is_file_read_only(file_path):# 文件是只读的# 取消文件的只读属性unset_file_read_only(file_path)else:# 文件不是只读的pass

(4)观察者对象

  • 创建观察者对象
observer = Observer()
  • 将自定义的事件处理器和要监视的目录绑定在一起
    event_handler:我们定义的自定义事件处理器的实例;
    directory:需要监视的目录路径;
    recursive=True 表示要递归地监视目录中的子目录。
observer.schedule(event_handler, directory, recursive=True)
  • 启动观察器,开始监听目录的变化
observer.start()
  • 保持文件监视器(Observer)持续运行,并在收到键盘中断信号(KeyboardInterrupt)时停止监视器的运行。
try:# 使用无限循环来保持观察器持续运行while True:# 在每次循环中,使用time.sleep(1)函数暂停1秒钟,以避免过度消耗CPU资源。time.sleep(1)
except KeyboardInterrupt:# 如果在循环中按下Ctrl+C,会引发KeyboardInterrupt异常。# 在异常处理块中,调用observer.stop()方法停止观察器的运行。observer.stop()
  • 等待观察器线程的结束
observer.join()

最后,将其封装成一个监听目录的函数 start_monitoring(directory),具体如下所示:

# 监听目录的函数
def start_monitoring(directory):# 创建事件处理器对象event_handler = MyEventHandler()# 创建观察者对象observer = Observer()# 将自定义的事件处理器和要监视的目录绑定在一起observer.schedule(event_handler, directory, recursive=True)# 启动观察器,开始监听目录的变化observer.start()try:# 使用无限循环来保持观察器持续运行while True:# 在每次循环中,使用time.sleep(1)函数暂停1秒钟,以避免过度消耗CPU资源。time.sleep(1)except KeyboardInterrupt:# 如果在循环中按下Ctrl+C,会引发KeyboardInterrupt异常。# 在异常处理块中,调用observer.stop()方法停止观察器的运行。observer.stop()# 等待观察器线程的结束observer.join()

四、最终实现的代码


打开微信,确定自己微信的文件管理路径 E:\WeChat Files\,接着开启监听 start_monitoring("E:/WeChat Files/"),就可以实现接收文件后立马自动取消文件只读属性啦,源码如下所示:

# coding:utf-8import os,stat
import time
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler# 判断文件是否只读
def is_file_read_only(file_path):if os.access(file_path, os.W_OK):# 如果文件或目录具有指定的权限,返回True。return Falseelse:# 如果文件或目录不具有指定的权限,# 或者检查过程中发生错误,返回False。return True# 取消文件的只读属性
def unset_file_read_only(file_path):# 获取当前文件的权限标志位file_stat = os.stat(file_path)# 取消只读属性,将其权限更改为可写new_mode = file_stat.st_mode | stat.S_IWUSR# 设置新的权限标志位os.chmod(file_path, new_mode)print("取消文件只读属性:",file_path)# 取消文件只读属性,函数会在文件变化时被调用
def remove_read_only(file_path):# file_path 参数是变化的文件路径print("文件已变化:", file_path)# 判断文件是否只读if is_file_read_only(file_path):# 文件是只读的# 取消文件的只读属性unset_file_read_only(file_path)else:# 文件不是只读的passclass MyEventHandler(FileSystemEventHandler):def on_any_event(self, event):print("event_type:",event.event_type)if event.is_directory:  # 忽略文件夹的变化returnif event.event_type == 'created' or event.event_type == 'modified':  # 只处理新建和修改事件file_path = event.src_pathremove_read_only(file_path)# 监听目录的函数
def start_monitoring(directory):# 创建事件处理器对象event_handler = MyEventHandler()# 创建观察者对象observer = Observer()# 将自定义的事件处理器和要监视的目录绑定在一起observer.schedule(event_handler, directory, recursive=True)# 启动观察器,开始监听目录的变化observer.start()try:# 使用无限循环来保持观察器持续运行while True:# 在每次循环中,使用time.sleep(1)函数暂停1秒钟,以避免过度消耗CPU资源。time.sleep(1)except KeyboardInterrupt:# 如果在循环中按下Ctrl+C,会引发KeyboardInterrupt异常。# 在异常处理块中,调用observer.stop()方法停止观察器的运行。observer.stop()# 等待观察器线程的结束observer.join()if __name__ == "__main__":# 获取要监听的文件夹路径# NO1:OKdirectory = 'E:/WeChat Files'# directory = 'E:/WeChat Files/'# NO2:OK# directory = 'E:\\WeChat Files'# NO3:Fail# directory = 'E:\WeChat Files'# 开启监听,满足条件就取消文件只读属性start_monitoring(directory)

我的微信公众号【会飞的小猴子】,等你来关注哦 ^ - ^


参考文章:

  • 《python设置文件只读与取消文件只读》
  • 《python文件监控模块Watchdog使你的文件管理更轻松》

版权声明:本文为博主原创文章,如需转载,请给出:
原文链接:https://blog.csdn.net/qq_35844043/article/details/131749805

【Python|第39期】监听目录取消文件只读属性相关推荐

  1. FileAlterationMonitor监听目录下文件变化

    工具类 FileMonitor package com.ncs.wavtrans.utils;import org.apache.commons.io.monitor.FileAlterationLi ...

  2. woo如何监听目录和文件变动,woo目录中的文件被改变,监听文件被修改权限

    记录下woo语言监听文件和和文件夹变动后触发事件 非常完整的例子了. 注意由于文件监听属于工具类,则需要使用wop而不是woo print('file notify')-- 初始化监听实列 local ...

  3. Qt5开发及实例学习之监听目录

    2019独角兽企业重金招聘Python工程师标准>>> #include "watcher.h" #include <QVBoxLayout> #in ...

  4. ROS中 Python/C++ 键盘按键监听事件

    ROS中 Python/C++ 键盘按键监听事件 这几天在肝全国智能驾驶大赛,真就挺累的:抓狂思考,手搓代码,疯狂编译,要命运行.在这趟火车上,被各种各样的问题卡住甚至卡死,就很难受好吧.至今,我深深 ...

  5. linux+默认监听+目录,C# 时时监听目录文件改动

    C# 时时监听目录文件改动: public static class DirectoryListen { public static string CountListXmlPath = CountCo ...

  6. python 实现统计ftp服务器指定目录下文件夹数目、文件数目及所有文件大小 本次主要为满足应用方核对上传到ftp服务器的文件是否缺漏。 主要要求:指定目录下,文件夹数目/文件数目/所有文件大小

    python 实现统计ftp服务器指定目录下文件夹数目.文件数目及所有文件大小 本次主要为满足应用方核对上传到ftp服务器的文件是否缺漏. 主要要求:指定目录下,文件夹数目/文件数目/所有文件大小,类 ...

  7. python tcp不用循环监听_网络编程: TCP

    1. IP 地址 概念: 标识网络中设备的地址(需要联网才有没有联网, 是没有这个地址) 表现形式: ipv4 目前主要使用的, 点分十进制的格式,(192.168.3.43) 分为 4 段, 每段的 ...

  8. python监听键盘库_python监听、操作键盘鼠标库pynput详细教程|python基础教程|python入门|python教程...

    https://www.xin3721.com/eschool/pythonxin3721/ § 0.0.0 前言 监听.操作鼠标.键盘是实现自动化的捷径,比如我实现自动化签到用到了模拟键盘操作. p ...

  9. php 监控文件夹变化,swoole 开发中监听目录文件变化, 自动重启项目

    在使用swoole的项目中, 在开发时, 会经常改动代码并查看效果, 由于swoole项目是常驻内存的, 代码改动后并不会影响已经在运行中并加载过该代码的程序, 所以需要重启项目. 为了在改动代码之后 ...

最新文章

  1. AI+零售:人工智能撬动零售变革
  2. 信息系统项目管理知识--
  3. pyqt5讲解1:窗口,QLabel,QLineEdit,QTextEdit
  4. 【C++】C++类的学习(一)——初识类
  5. 异常和中断处理流程: Exception- or Interrupt-Handler Procedures
  6. Glad You Came--带条件的线段树区间更新,区间查询(其实是单点查询)
  7. 移动应用框架 Ionic 4 Ionic for Everyone
  8. 马尔科夫决策过程(MDP):汽车租赁问题
  9. android 简书代码截图工具,Android 截屏
  10. 基于Python的淘宝用户行为分析
  11. 单片机学习笔记(数码管)
  12. Python 集合符号
  13. DC-DC隔离电源模块与非隔离电源模块有什么区别?
  14. OJ 1478 机器翻译
  15. windows10更新服务器修改,Windows 10彻底关闭自动更新(Windows Update和Windows Update Medic Service)...
  16. 【51CTO学院三周年】随身携带的象牙塔
  17. SPA单页面应用首屏加载速度提升方法
  18. 制作补丁与打补丁简单原理
  19. 翻译app上的图片文字信息提取好神奇?如何实现一个文字图片识别程序
  20. AAA云免费云主机推荐码

热门文章

  1. 实验8-2-5 判断回文字符串 (20分)
  2. Charles使用技巧
  3. jq删除数组中的指定元素
  4. Redis发布订阅和应用场景
  5. 虚幻商城模型转MetaHuman
  6. 创客教育中的统筹方案管理模式
  7. python语言是编译执行_加速Python运行的工具
  8. 图集与DrawCall分析
  9. Hive的简介及安装
  10. 利润分配计算机公式,未分配利润计算公式