删除 win10 无限嵌套的文件夹 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
xiaonzha
V2EX    程序员

删除 win10 无限嵌套的文件夹

  •  1  
  •   xiaonzha
    pb-qd 2023-04-25 11:17:23 +08:00 2902 次点击
    这是一个创建于 903 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    另外,注意我将目录分隔符从反斜杠(\)改为正斜杠(/),以确保代码在不同操作系统上的兼容性。
    xiaonzha
        8
    xiaonzha  
    OP
       2023-04-25 16:00:00 +08:00
    @ShareDuck 这个他也不知道,我同事出现这个问题后让我看一下能不能解决,他就平时用 SOLIDWORKS 画画 3D 图,别的也没啥事。
    xiaonzha
        9
    xiaonzha  
    OP
       2023-04-25 16:00:42 +08:00
    @blankmiss 不错,哈哈我自己写不出来,只能看懂语法
    xiaonzha
        10
    xiaonzha  
    OP
       2023-04-25 16:00:58 +08:00
    @LeegoYih 不清楚
    xiaonzha
        11
    xiaonzha  
    OP
       2023-04-25 16:01:16 +08:00
    @NoOneNoBody 嗯,这个可以删除
    xiaonzha
        12
    xiaonzha  
    OP
       2023-04-25 16:01:53 +08:00
    @ysc3839 等今晚在虚拟机里写个嵌套文件夹,去试试
    xiaonzha
        13
    xiaonzha  
    OP
       2023-04-25 16:02:12 +08:00
    @cnbatch 学到了,收藏了
    xiaonzha
        14
    xiaonzha  
    OP
       2023-04-25 16:03:25 +08:00
    @zhiyu1998 不错,可以的。我刚学不久,勉强可以看懂语法,但是还是写不出这样的程序
    zhiyu1998
        15
    zhiyu1998  
       2023-04-25 16:30:12 +08:00
    @xiaonzha gpt4 写的 哈哈哈
    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 为何无需提权可以做到
    fumichael
        17
    fumichael  
       2023-04-25 21:31:32 +08:00
    alleluya
        18
    alleluya  
       2023-04-26 11:27:18 +08:00
    @fumichael 都是 nodejs 写的话 rimraf 适用范围更广?
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2572 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 15:27 PVG 23:27 LAX 08:27 JFK 11:27
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86