这里是你的答案如何遍历一个大的目录文件一个文件!在
我像个疯子一样搜索一个Windows动态链接库,它能让我在Linux上做些什么,但是没有运气。在
因此,我得出结论,唯一的方法就是创建自己的DLL,将这些静态函数公开给我,但后来我想起了pywintypes。
还有,耶!这已经在那里完成了。而且,一个迭代器函数已经实现了!酷!在
带有FindFirstFile()、FindNextFile()和FindClose()的Windows DLL可能仍在某处,但我没有找到它。所以,我用了pywintypes。在
编辑:
我发现(很晚)这些函数可以从kernel32.dll获得。一直躲在我鼻子前面。在
很抱歉你的依赖。但我认为你可以提取win32文件.pyd从…\site packages\win32文件夹和最终的依赖项,并将其独立于win32types与程序一起分发(如果需要)。在
正如你从速度测试中看到的,返回发电机的速度非常快。在
在这之后,你就可以一个文件地去做任何你想做的事情。在NOTE: win32file.FindFilesIterator() returns whole stat of the file/dir, therefore, using my listdir() to get the name and afterwards os.path.get*time() or os.path.is*() doesn't make sense. Better modify my listdir() for those checks.
现在,要完全解决你的问题仍然是个问题。在
对你来说,坏消息是这是从它喜欢的目录中的第一个项目开始的,你不能选择它将是哪一个。在我的测试中,它总是返回排序后的目录。(在Windows上)
半个好消息是,你可以在Windows上使用通配符来控制列出哪些文件。因此,要在一个不断填充的目录中使用此选项,您可以用版本标记新的文件,并执行以下操作:
^{pr2}$
但你必须设计得非常巧妙,否则你会有文件到达,但你没有找到他们,因为他们迟到了。在
如果在循环圈之间引入延迟,我不知道findFileIterator()是否会在新文件出现时继续检测它们。在
如果是这样,这也可能是你的解决方案。在
您始终可以预先生成迭代器,然后调用next()方法来获取下一个文件:i = listdir(".")
while True:
try: name = i.next()
except StopIteration: sleep(1)
# This probably won't work as imagined though
您可以根据最后到达的文件的大小决定等待新文件的时间。疯狂地猜测所有传入的文件大小大致相同加上或减去一些东西。在
但是,win32file提供了一些功能,可以帮助您监视目录的更改,我认为这是您最好的选择。在
在速度测试中,您还可以看到从这个迭代器构造列表比调用操作系统列表目录(),但是操作系统列表目录()将阻止,我的listdir()将不会。
它的目的不是创建文件列表。我不知道为什么会出现这种速度损失。只能猜测DLL调用、列表构造、排序之类的东西。操作系统列表目录()完全是用C写的