发现 windows10 中一个硬盘,显而易见的增加存储用量,然后找到了一个文件夹,查看属性的时候,会慢慢的增大,然后就一直增大,尝试删除的时候删除时间很久,最后也是卡在最后 5%,删不掉。然后搜了教程,使用 CMD 命令: Robocopy /MIR empty wrongFile ( Robocopy /MIR source destination )然后运行一段时间显示失败。就看了一些程序,最后使用Cursor自动生成代码,写了一个“递归删除,文件路径为"D:\test"的无限嵌套文件夹”程序。
import os
def delete_folder(path):
if os.path.exists(path):
for file in os.listdir(path):
file_path = os.path.join(path,file)
if os.path.isdir(file_path):
delete_folder(file_path)
else:
os.remove(file_path)
os.rmdir(path)
# 修改“D:\test”为需要删除的文件夹
delete_folder("D:\test")
![]() |
1
blankmiss 151 天前
chatgpt 函数编程
``` import os def delete_folder(path): if os.path.exists(path): # 使用 map 函数将 os.listdir 返回的文件名映射为完整路径 files = map(lambda f: os.path.join(path, f), os.listdir(path)) # 对每个文件进行递归删除或直接删除 list(map(delete_folder, filter(os.path.isdir, files))) list(map(os.remove, filter(os.path.isfile, files))) # 删除空目录 os.rmdir(path) ``` |
2
ShareDuck 151 天前
问题是这么目录怎么来的?
|
![]() |
3
LeegoYih 151 天前
shutil.rmtree 可以吗?
|
![]() |
4
ysc3839 151 天前 via Android
可以直接在 Git Bash 里 rm -rf
|
5
NoOneNoBody 151 天前
你这个能删?
win10/11 常常会出现一类文件夹,无论怎么改都是只读属性,python 遇到这种文件夹删除或改名会出错 |
6
cnbatch 151 天前
无法删除,其实就是路径长度限制 255 的缘故,自 Win10 起可以手动解除:
用组策略接触限制,立即生效 https://www.microfocus.com/documentation/filr/filr-4/filr-desktop/t47bx2ogpfz7.html 或者用注册表解除限制 https://learn.microsoft.com/en-us/windows/win32/fileio/maximum-file-path-limitation?tabs=registry 一劳永逸 |
![]() |
7
zhiyu1998 151 天前
你的代码已经很不错了,我做了一些小调整,使用 os.path.join()来确保跨平台兼容性,并使用 os.walk()来简化代码。这里是优化后的代码:
``` import os def delete_folder(path): if os.path.exists(path): for root, dirs, files in os.walk(path, topdown=False): for file in files: file_path = os.path.join(root, file) if os.path.isfile(file_path): os.remove(file_path) for dir in dirs: dir_path = os.path.join(root, dir) if os.path.isdir(dir_path): os.rmdir(dir_path) os.rmdir(path) # 修改 "D:/test" 为需要删除的文件夹 delete_folder("D:/test") ``` 这里我们使用了 os.walk(),它可以遍历给定目录下的所有子目录和文件。我们设置 topdown 参数为 False 以从底层子目录向上递归地遍历目录结构。这样,我们可以先删除底层子目录中的文件,然后逐层向上删除空子目录,最后删除顶层目录。这个方法相对简洁,也减少了递归层数。 另外,注意我将目录分隔符从反斜杠(\)改为正斜杠(/),以确保代码在不同操作系统上的兼容性。 |
![]() |
11
xiaonzha OP @NoOneNoBody 嗯,这个可以删除
|
16
NoOneNoBody 151 天前
@xiaonzha #11
1. 没考虑 WinError 5 的情况 2. 没考虑 follow_symlinks 的情况 3. 没考虑递归次数,也就是“无限嵌套”要考虑更多 我#5 所说是一种特殊情况,win10 以前不多见,就是有些目录怎么改都是 readonly ,用 python 或者一些批量删除工具如 fastcopy 之类会出错,这种目录目前仅 total commander 和文件管理器提权可以直接删,后者很慢,但我用过的工具有限,我很好奇 total commander 为何无需提权可以做到 |
![]() |
17
fumichael 150 天前
|