代码之家  ›  专栏  ›  技术社区  ›  Tavy

不使用os.listdir检查目录是否为空

  •  0
  • Tavy  · 技术社区  · 5 年前

    我需要一个函数来检查目录是否为空,但它应该尽可能快,因为我将它用于数千个目录,这些目录最多可以包含10万个文件。我实现了下一个,但看起来python3中的kernel32模块有问题(我得到 OSError: exception: access violation writing 0xFFFFFFFFCE4A9500 在FindNextFileW上,从第一次调用开始)

    import os
    import ctypes
    from ctypes.wintypes import WIN32_FIND_DATAW
    
    def is_empty(fpath):
        ret = True
        loop = True
        fpath = os.path.join(fpath, '*')
        wfd = WIN32_FIND_DATAW()
        handle = ctypes.windll.kernel32.FindFirstFileW(fpath, ctypes.byref(wfd))
        if handle == -1:
            return ret
        while loop:
            if wfd.cFileName not in ('.', '..'):
                ret = False
                break
            loop = ctypes.windll.kernel32.FindNextFileW(handle, ctypes.byref(wfd))
        ctypes.windll.kernel32.FindClose(handle)
        return ret
    
    print(is_empty(r'C:\\Users'))
    
    0 回复  |  直到 5 年前
        1
  •  2
  •   Adam.Er8    5 年前

    您可以使用 os.scandir 的迭代器版本 listdir ,并在“迭代”第一个条目时简单地返回,如下所示:

    import os
    
    def is_empty(path):
        with os.scandir(path) as scanner:
            for entry in scanner: # this loop will have maximum 1 iteration
                return False # found file, not empty.
        return True # if we reached here, then empty.