PermissionError: [WinError 5] 拒绝访问。OSError: [WinError 17] 系统无法将文件移到不同的磁盘驱动器。

发布于:2023-10-25 ⋅ 阅读:(215) ⋅ 点赞:(0)

在使用shutil.move()剪切文件时报错OSError: [WinError 17] 系统无法将文件移到不同的磁盘驱动器。

PermissionError: [WinError 5] 拒绝访问。

检查发现文件成功复制到目标文件夹,但源文件未被删除。故直接定位问题为剪切时成功复制但删除失败。

一开始以为是文件还在剪切的过程,导致被占用无法关闭所以无法删除,但使用sleep等待一段时间后依然报此错误,经过一番查找可能是以下原因:

1.文件被其他进程占用无法删除。

2.文件被设置只读属性,无法删除。

3.用户无权限。

已排除第一点,手动可以删除文件,排除第三点。

锁定第二点,使用os cmd指令更改文件的状态在进行删除(可以选择直接修改shutil源代码),或者将shutil.move()拆成shutil.copy()与os.remove()

import os,shutil,stat
def ifcopy(file,targetpath):
    tarr = os.path.join(targetpath,os.path.basename(file))
    while True:
        time.sleep(.5)
        if os.path.exists(tarr):
            try:
                os.remove(tarr)
            except:
                os.chmod(tarr, stat.S_IWRITE)
                os.remove(tarr)
            break
shutil.copy(file, targetpath)
ifcopy(file, targetpath)

成功运行