使用shutil.copy2复制Windows用户文件夹遇PermissionError求助
解决Windows用户文件夹复制时的PermissionError问题
核心问题:API用法错误
你遇到的PermissionError本质不是权限不足,而是误用了shutil.copy2——这个方法是用来复制单个文件的,你传入的是文件夹路径(比如C:\Users\name\Videos),它会尝试把文件夹当作文件打开读取,自然触发权限错误。
正确解决方案
1. 使用shutil.copytree复制文件夹
要复制整个文件夹及其内容,必须用shutil.copytree,同时处理目标文件夹已存在的情况(Python 3.8+支持dirs_exist_ok=True参数实现合并/覆盖)。
2. 修复后的代码示例
import shutil from pathlib import Path from colorama import Fore def copyFolders(user, usbDrive): userPath = Path(f"C:/Users/{user}") priorityLs = ["Music", "Documents", "Desktop", "Downloads", "Pictures", "Videos"] permissionErrors = 0 permissionGrant = 0 for folder_name in priorityLs: src_folder = userPath / folder_name dst_folder = Path(usbDrive) / folder_name print(f"Copying {src_folder}...") try: # 复制整个文件夹,目标存在时自动合并 shutil.copytree( src_folder, dst_folder, dirs_exist_ok=True, ignore=shutil.ignore_patterns('*.tmp', '*.lock') # 可选:跳过临时/锁定文件 ) except PermissionError: print(Fore.RED + f"权限错误:无法访问 {src_folder}" + Fore.RESET) permissionErrors += 1 else: permissionGrant += 1 print(f"成功复制:{permissionGrant} | 权限错误:{permissionErrors}")
3. 处理单个锁定文件
Windows中部分文件可能被系统或程序锁定(比如正在播放的视频、打开的文档),即使管理员也无法读取,可以自定义复制函数跳过这类文件:
def safe_copy2(src, dst, **kwargs): global permissionErrors try: shutil.copy2(src, dst, **kwargs) except PermissionError: permissionErrors += 1 print(Fore.YELLOW + f"跳过锁定文件:{src}" + Fore.RESET) # 在copytree中替换默认复制函数 shutil.copytree(src_folder, dst_folder, dirs_exist_ok=True, copy_function=safe_copy2)
4. 路径处理优化
用pathlib或os.path.join代替字符串拼接,避免转义字符问题(比如\在字符串中是转义符,用/更安全)。
关于"恶意软件可访问"的说明
恶意软件通常通过进程注入、漏洞利用等方式绕过系统权限限制,正常程序即使以管理员运行,也会受Windows文件系统权限和文件锁定机制约束,这是正常的安全限制。
内容的提问来源于stack exchange,提问作者Pixel
相关产品推荐
相关产品推荐

