V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
xiaonzha
V2EX  ›  程序员

删除 win10 无限嵌套的文件夹

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

    发现 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   ·   实用小工具   ·   5425 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 42ms · UTC 06:49 · PVG 14:49 · LAX 22:49 · JFK 01:49
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.