发现 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 2023-04-25 11:34:47 +08:00
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 2023-04-25 11:47:24 +08:00
问题是这么目录怎么来的?
|
3
LeegoYih 2023-04-25 12:25:42 +08:00
shutil.rmtree 可以吗?
|
4
ysc3839 2023-04-25 12:48:19 +08:00 via Android
可以直接在 Git Bash 里 rm -rf
|
5
NoOneNoBody 2023-04-25 12:51:42 +08:00
你这个能删?
win10/11 常常会出现一类文件夹,无论怎么改都是只读属性,python 遇到这种文件夹删除或改名会出错 |
6
cnbatch 2023-04-25 13:34:41 +08:00
无法删除,其实就是路径长度限制 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 2023-04-25 13:51:23 +08:00
你的代码已经很不错了,我做了一些小调整,使用 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 以从底层子目录向上递归地遍历目录结构。这样,我们可以先删除底层子目录中的文件,然后逐层向上删除空子目录,最后删除顶层目录。这个方法相对简洁,也减少了递归层数。 另外,注意我将目录分隔符从反斜杠(\)改为正斜杠(/),以确保代码在不同操作系统上的兼容性。 |
8
xiaonzha OP @ShareDuck 这个他也不知道,我同事出现这个问题后让我看一下能不能解决,他就平时用 SOLIDWORKS 画画 3D 图,别的也没啥事。
|
11
xiaonzha OP @NoOneNoBody 嗯,这个可以删除
|
16
NoOneNoBody 2023-04-25 16:34:54 +08:00
@xiaonzha #11
1. 没考虑 WinError 5 的情况 2. 没考虑 follow_symlinks 的情况 3. 没考虑递归次数,也就是“无限嵌套”要考虑更多 我#5 所说是一种特殊情况,win10 以前不多见,就是有些目录怎么改都是 readonly ,用 python 或者一些批量删除工具如 fastcopy 之类会出错,这种目录目前仅 total commander 和文件管理器提权可以直接删,后者很慢,但我用过的工具有限,我很好奇 total commander 为何无需提权可以做到 |
17
fumichael 2023-04-25 21:31:32 +08:00
|