如何使用Python实现文件及文件夹的隐藏功能?
Python实现跨平台文件/文件夹隐藏功能
核心逻辑
不同操作系统的文件隐藏规则不一致,需要分别适配:
- Windows系统:通过修改文件/文件夹的
隐藏属性实现 - Linux/macOS系统:通过给文件/文件夹名称前添加
.前缀实现
完整代码实现
import os import sys import ctypes from pathlib import Path def hide(target_path: str, is_hidden: bool = True) -> None: """ 隐藏或取消隐藏指定的文件/文件夹 :param target_path: 要操作的文件/文件夹路径 :param is_hidden: True为隐藏,False为取消隐藏 """ path = Path(target_path).absolute() if not path.exists(): raise FileNotFoundError(f"路径不存在:{target_path}") # Windows系统处理逻辑 if sys.platform.startswith("win"): FILE_ATTRIBUTE_HIDDEN = 0x2 # 获取当前属性 attrs = ctypes.windll.kernel32.GetFileAttributesW(str(path)) if attrs == -1: raise OSError(f"无法读取路径属性:{target_path}") # 修改属性 if is_hidden: new_attrs = attrs | FILE_ATTRIBUTE_HIDDEN else: new_attrs = attrs & ~FILE_ATTRIBUTE_HIDDEN res = ctypes.windll.kernel32.SetFileAttributesW(str(path), new_attrs) if res == 0: raise OSError(f"修改属性失败:{target_path}") # Unix类系统(Linux/macOS)处理逻辑 else: parent_dir = path.parent current_name = path.name if is_hidden: if not current_name.startswith("."): new_name = f".{current_name}" new_path = parent_dir / new_name if new_path.exists(): raise FileExistsError(f"目标路径已存在:{new_path}") path.rename(new_path) else: if current_name.startswith("."): new_name = current_name.lstrip(".") # 避免名称全是点的情况出现空名称 if not new_name: return new_path = parent_dir / new_name if new_path.exists(): raise FileExistsError(f"目标路径已存在:{new_path}") path.rename(new_path)
使用示例
# 隐藏文件 hide("VerySecretFile.txt") # 隐藏文件夹 hide("SecretFolder") # 取消隐藏文件 hide("VerySecretFile.txt", is_hidden=False)
注意事项
- 操作需要对应路径的读写权限,权限不足会抛出异常
- 该方案实现的是系统默认的常规隐藏,用户开启显示隐藏文件/文件夹后仍然可以看到内容
- Unix系统下修改名称会改变文件的原始路径,依赖原路径的其他业务逻辑需要同步调整
内容的提问来源于stack exchange,提问作者Aaseer
相关产品推荐
相关产品推荐

