使用Python和ftplib,我编写了一个通用函数来检查FTP目录中的项目是文件还是目录。由于使用MLSD功能可能不一定适用于所有服务器(我的一个用例没有提供它)我通过尝试将目录更改为对象以及对象是否已经采用这种有效但粗略的方式来确定它一个文件,引发异常并相应地设置文件类型。
file_type = ''
try:
ftp.cwd(item_name)
file_type = 'dir'
ftp.cwd(cur_path)
except ftplib.error_perm:
file_type = 'file'
我已经搜索了其他方法的互联网和图书馆文档,但我找不到适用于大多数情况的方法。
例如,使用dir
函数,我可以检查第一个字符是否为'd'
,这可能会确定它,但是进一步的读数表明并非所有输出都具有相同的格式。
我在这种方法中可以看到的最大缺陷是,如果我没有权限将目录更改为指定的文件夹;因此它将被视为文件。
我有什么遗漏或更清洁的方法吗?
答案 0 :(得分:1)
没有更好的方法(通常使用FTP协议,而不仅仅是使用ftplib)。
MLST
/ MLSD
是唯一正确可靠的方式。
如果您无法使用MLST
/ MLSD
,则尝试CWD
是下一个最佳选择。
尝试解析LIST
是一个后备选项。但是你需要知道服务器使用你的程序理解的列表格式。
答案 1 :(得分:0)
这是我通过FTP版os.walk
用于FTP服务器的功能。如果您想查看完整代码https://github.com/Kasramvd/FTPwalk:
def listdir(self, connection, _path):
file_list, dirs, nondirs = [], [], []
try:
connection.cwd(_path)
except:
return [], []
connection.retrlines('LIST', lambda x: file_list.append(x.split()))
for info in file_list:
ls_type, name = info[0], info[-1]
if ls_type.startswith('d'):
dirs.append(name)
else:
nondirs.append(name)
return dirs, nondirs
说明:
在这里,您只需循环遍历目标目录中的文件和目录并选择目录即可。但是,由于您无法像在OS中使用的那样执行此操作,因此需要使用ftplib.FTP.retrlines()
函数来检索ASCII传输模式下的文件或目录列表,然后您可以通过解析这些行来分隔目录。