WindowsError使用os.listdir和os.stat的结果

我有下面的代码片段,获取文件的时间戳。

files_list = os.listdir(os.path.join(path, folder)) for files in files_list: stats = os.stat(os.path.join(path, folder, files)) 

是否有可能让我得到下面的错误,因为它似乎违反直觉,它不能够find一个文件,它刚刚在listdir中,除了竞争条件的情况下,这是不是我怀疑在这种情况下。

 WindowsError: [Error 2] The system cannot find the file specified: '\\\\sftp-server.domain.com\\homes\\server\\location\\FOLDER\\FILE.PDF' 

我也想知道,如域名查找/临时networking问题可以导致这个错误? 例如

\\sftp-server.domain\\homes\\server\\location\\FOLDER

\\sftp-server.domain\\homes\\server\\location\\FOLDER\FILE

只是URLstring,与真正的文件系统遍历没有任何关系。

据推测FOLDERFILE不是真正的名字? 仔细看一下WindowsError报告的文件名。 如果它们在最后一个组件中包含问号,则说明Unicode文件名有问题。 具体来说,如果目录包含Unicode字符在当前代码页中不可表示的文件名(例如西欧或东欧语言环境中的日语字符),则os.listdir将返回具有不可表示的Unicode字符的文件名,并将其转换为? 。 很显然,这些基本上是坏的名字不能被传递给IO函数,比如open或者os.stat

要解决这个问题,请通过将目录作为Unicode字符串传递给os.listdir来请求Unicode文件名。 这些将包含正确的字符,并可以传递给os.stat ,这将内部调用广泛的API:

 dirname = unicode(os.path.join(path, folder), 'mbcs') file_list = os.listdir(dirname) for filename in file_list: stats = os.stat(os.path.join(dirname, filename)) # ... 

服务器正在做多线程,我们发送多个Ajax请求在一个单一的Javascript方法到相同的文件夹资源。

os.listdir处理的情况下,首先会发生此错误,因为它需要很长时间才能通过SFTP执行。 在此期间, os.remove发生在另一个请求中,并删除了os.listdir结果中显示的文件。 使他作为一个适当的回调os.listdir函数后,它工作得很好。