Python压缩ZIP后无法删除文件及目录:PermissionError权限问题
问题
使用Python的zipfile模块打包文件后,删除ZIP文件及关联目录时触发PermissionError,报错信息如下:
Application Command raised an exception: PermissionError: [WinError 32] The process cannot access the file because it is being used by another process: 'sent\mp_m_freemode_01-task_diff_001_[A-Z]_uni.ytd'
原代码:
for file in glob.glob('sent/*.ytd'): discord_prep = discord.File(file) uniforms.append(file) print("-- File to Send --") print(file) print("- File to Send Array -") print(uniforms) with zipfile.ZipFile(name + ".zip", mode="w") as archive: print("Making Archieve") for filename in uniforms: print(filename) archive.write(filename) archive.close() final_zip = discord.File(name + ".zip") await discord.asyncio.sleep(1) await ctx.send( file=final_zip ) os.remove(name + ".zip") removing_files = glob.glob('sent/*.ytd') dir = os.listdir("sent/") if not len(dir) == 0: print("Clearing YTDs from Sent Folder") for i in removing_files: os.remove(i) print("All YTDs Removed") else: print("No YTDs to Clear") shutil.rmtree("sent/", ignore_errors=False, onerror=None) print("Sent Folder Deleted")
解决方案
问题根源
- 循环中创建的
discord_prep = discord.File(file)无实际用途,但会持续占用文件句柄,导致后续删除文件时提示被占用 - 手动调用
archive.close()属于冗余操作,with语句会自动关闭ZipFile对象,重复关闭可能引发异常 final_zip作为discord.File对象,发送后可能未及时释放文件句柄就执行删除操作
修改后的代码
uniforms = [] for file in glob.glob('sent/*.ytd'): uniforms.append(file) print("-- File to Send --") print(file) print("- File to Send Array -") print(uniforms) # with语句自动管理ZipFile生命周期,无需手动close with zipfile.ZipFile(name + ".zip", mode="w") as archive: print("Making Archive") for filename in uniforms: print(filename) archive.write(filename) # 直接在send中创建discord.File,发送完成后自动释放文件句柄 await ctx.send(file=discord.File(name + ".zip")) # 延长等待时间,确保Discord完成文件上传与本地文件句柄释放 await discord.asyncio.sleep(2) # 删除zip文件 os.remove(name + ".zip") # 简化文件清理逻辑 removing_files = glob.glob('sent/*.ytd') if removing_files: print("Clearing YTDs from Sent Folder") for i in removing_files: os.remove(i) print("All YTDs Removed") else: print("No YTDs to Clear") # 删除sent目录 shutil.rmtree("sent/", ignore_errors=False, onerror=None) print("Sent Folder Deleted")
关键修改点
- 移除无用的
discord_prep对象,彻底释放被占用的ytd文件句柄 - 删除冗余的
archive.close(),依赖with语句自动关闭zip文件 - 直接在
ctx.send中构建discord.File,避免额外对象引用导致文件句柄滞留 - 适当延长sleep时间,确保Discord完成文件上传后再执行删除操作
内容的提问来源于stack exchange,提问作者Welshy
相关产品推荐
相关产品推荐

