使用 os.listdir 和 os.stat 时出现 WindowsError 的结果



我有以下代码片段,它只是获取文件的时间戳。

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

我是否有可能收到以下错误,因为它无法找到刚刚在 listdir 中获得的文件似乎违反直觉,当然除了在这种情况下我怀疑的竞争条件。

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

我还想知道域查找/临时网络问题是否会导致此错误?例如

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

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

只是 URL 字符串,与实际文件系统遍历无关。

大概FOLDERFILE不是实际名称?仔细查看WindowsError报告的文件名。如果它们在最后一个组件中包含问号,则 Unicode 文件名有问题。具体而言,当目录包含的文件名包含当前代码页中无法表示的 Unicode 字符(如西欧或东欧区域设置中的日语字符)时,os.listdir将返回文件名,其中不可表示的 Unicode 字符转换为 ? 。显然,这种本质上损坏的名称不能传递给 IO 函数,例如 openos.stat

要解决此问题,请通过os.listdir将目录作为 Unicode 字符串传递来从 请求 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))
    # ...

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

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

最新更新