删除 win10 无限嵌套的文件夹

2023-04-25 11:17:23 +08:00
 xiaonzha

发现 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")
2497 次点击
所在节点    程序员
18 条回复
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)
```
ShareDuck
2023-04-25 11:47:24 +08:00
问题是这么目录怎么来的?
LeegoYih
2023-04-25 12:25:42 +08:00
shutil.rmtree 可以吗?
ysc3839
2023-04-25 12:48:19 +08:00
可以直接在 Git Bash 里 rm -rf
NoOneNoBody
2023-04-25 12:51:42 +08:00
你这个能删?
win10/11 常常会出现一类文件夹,无论怎么改都是只读属性,python 遇到这种文件夹删除或改名会出错
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

一劳永逸
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 以从底层子目录向上递归地遍历目录结构。这样,我们可以先删除底层子目录中的文件,然后逐层向上删除空子目录,最后删除顶层目录。这个方法相对简洁,也减少了递归层数。

另外,注意我将目录分隔符从反斜杠(\)改为正斜杠(/),以确保代码在不同操作系统上的兼容性。
xiaonzha
2023-04-25 16:00:00 +08:00
@ShareDuck 这个他也不知道,我同事出现这个问题后让我看一下能不能解决,他就平时用 SOLIDWORKS 画画 3D 图,别的也没啥事。
xiaonzha
2023-04-25 16:00:42 +08:00
@blankmiss 不错,哈哈我自己写不出来,只能看懂语法
xiaonzha
2023-04-25 16:00:58 +08:00
@LeegoYih 不清楚
xiaonzha
2023-04-25 16:01:16 +08:00
@NoOneNoBody 嗯,这个可以删除
xiaonzha
2023-04-25 16:01:53 +08:00
@ysc3839 等今晚在虚拟机里写个嵌套文件夹,去试试
xiaonzha
2023-04-25 16:02:12 +08:00
@cnbatch 学到了,收藏了
xiaonzha
2023-04-25 16:03:25 +08:00
@zhiyu1998 不错,可以的。我刚学不久,勉强可以看懂语法,但是还是写不出这样的程序
zhiyu1998
2023-04-25 16:30:12 +08:00
@xiaonzha gpt4 写的 哈哈哈
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 为何无需提权可以做到
fumichael
2023-04-25 21:31:32 +08:00
alleluya
2023-04-26 11:27:18 +08:00
@fumichael 都是 nodejs 写的话 rimraf 适用范围更广?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/935297

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX