日期: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. php依次替换src,如何在php中替换img中src内容
  2. 进腾讯了!(实习面经分享)
  3. python3写一个计算器_Python3 写了一个简单的模拟计算器 总是报错 有知道的大神 帮忙解答下 非常感谢...
  4. 【Python】全文3000字,Pyecharts制作可视化大屏全流程! (附代码分享)
  5. 排序算法java 简书_史上最全经典排序算法总结(Java实现)
  6. 提取过程_大米多肽提取过程中如何应用膜分离技术呢?
  7. ADSL提速 从入门到精通
  8. MyBatis之使用resultMap实现高级映射
  9. android studio break,Android Studio IDE: Break on Exception
  10. C# List的克隆
  11. 查看及修改当前数据库的所支持的数据库引擎以及默认数据库引擎
  12. [Unity基础]01Unity基本操作
  13. 时速云CEO:相对于IaaS和PaaS,未来CaaS将如何定位?
  14. CentOS install btsync
  15. C语言知识点思维导图
  16. python二级题库(百分之九十原题) 刷题软件推荐
  17. archlinux + dwm系统美化
  18. html 脚本错误,脚本错误怎么解决,教您脚本错误怎么解决?
  19. Vulnhub_Noob
  20. 进制之间快速转换技巧

热门文章

  1. Ubuntu进入root权限命令——sudo和su命令详解
  2. 时序数据预测:LSTM
  3. 欧盟遗憾英议会否决“脱欧”协议 称“脱欧”乱局风险加大
  4. html广告加图片,视频某段加一张图片覆盖 视频中间段画面有广告加一张图片遮住...
  5. 程序员脱单秘籍 | 我跟JVM搞对象!【深度剖析对象的创建和内存分配】
  6. 打造前端构建环境(1)
  7. 设置和获取文本框的value
  8. ERR_SSL_VERSION_OR_CIPHER_MISMATCH on win10 chrome
  9. python从入门到精通-Python从入门到精通 PDF 完整超清版
  10. C++的编程思想和进阶编程