我有下面的代码片段,获取文件的时间戳。
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,与真正的文件系统遍历没有任何关系。
据推测FOLDER
和FILE
不是真正的名字? 仔细看一下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函数后,它工作得很好。