You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 06:37:10