import os import sys import ctypes from ctypes import Structure from ctypes import byref import ctypes.wintypes as wintypes from ctypes import addressof FILE_ATTRIBUTE_DIRECTORY = 16 OPEN_EXISTING = 3 MAX_PATH = 260 GetLastError = ctypes.windll.kernel32.GetLastError class FILETIME(Structure): _fields_ = [("dwLowDateTime", wintypes.DWORD), ("dwHighDateTime", wintypes.DWORD)] class WIN32_FIND_DATAW(Structure): _fields_ = [("dwFileAttributes", wintypes.DWORD), ("ftCreationTime", FILETIME), ("ftLastAccessTime", FILETIME), ("ftLastWriteTime", FILETIME), ("nFileSizeHigh", wintypes.DWORD), ("nFileSizeLow", wintypes.DWORD), ("dwReserved0", wintypes.DWORD), ("dwReserved1", wintypes.DWORD), ("cFileName", wintypes.WCHAR * MAX_PATH), ("cAlternateFileName", wintypes.WCHAR * 20)] def windows_walk(folder): folder = unicode(folder) if not folder.startswith(u'\\\\?\\'): if folder.startswith(u'\\\\'): # network drive folder = u'\\\\?\\UNC' + folder[1:] else: # local drive folder = u'\\\\?\\' + folder dirs = [] files = [] data = WIN32_FIND_DATAW() gle = 0 h = ctypes.windll.kernel32.FindFirstFileW(os.path.join(folder, u'*'), byref(data)) gle = ctypes.windll.kernel32.GetLastError() if h < 0: ctypes.windll.kernel32.FindClose(h) if not sys.stderr.isatty(): print >> sys.stderr, 'Failed to find first file %s' % (os.path.join(folder, u'*'),) if gle != 5: # access denied. raise WindowsError('FindFirstFileW %s, Error: %d' % (folder, ctypes.windll.kernel32.GetLastError())) return if data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY: if data.cFileName not in (u'.', u'..'): dirs.append(data.cFileName[:]) else: files.append(data.cFileName[:]) try: while ctypes.windll.kernel32.FindNextFileW(h, byref(data)): if data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY: if data.cFileName not in (u'.', u'..'): dirs.append(data.cFileName[:]) else: files.append(data.cFileName[:]) except WindowsError as e: if not sys.stderr.isatty(): print >> sys.stderr, 'Failed to find next file %s, handle %d, buff addr: 0x%x' % (os.path.join(folder, u'*'), h, addressof(data)) ctypes.windll.kernel32.FindClose(h) yield folder, dirs, files for d in dirs: for base, ds, fs in windows_walk(os.path.join(folder, d)): yield base, ds, fs if __name__=='__main__': for root, dirs, files in windows_walk(os.getcwdu()): for f in files: abspath = os.path.join(root, f) print abspath