【问题标题】:Checking if object on FTP server is file or directory using Python and ftplib使用 Python 和 ftplib 检查 FTP 服务器上的对象是文件还是目录
【发布时间】:2016-08-22 01:23:35
【问题描述】:

使用 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',这可能会确定它,但是进一步阅读表明并非所有输出都具有相同的格式。

我在这种方法中看到的最大缺陷是如果我没有将目录更改为指定文件夹的权限;因此它将被视为一个文件。

有什么我遗漏的或更清洁的方法吗?

【问题讨论】:

    标签: python ftp ftplib


    【解决方案1】:

    这是我通过 FTP 版本的os.walk 为 FTP 服务器使用的功能。如果你想看完整代码,这里是github链接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 传输模式检索文件或目录列表,然后您可以通过解析这些行来分隔目录。

    【讨论】:

      【解决方案2】:

      没有更好的方法(一般使用 FTP 协议,而不仅仅是使用 ftplib)。

      MLST/MLSD 是唯一正确可靠的方法。

      如果您无法使用MLST/MLSD,则尝试CWD 是下一个最佳选择。

      尝试解析LIST 是一个后备选项。但是您需要知道服务器使用您的程序可以理解的列表格式。

      【讨论】:

        猜你喜欢
        • 2013-01-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-26
        • 2012-05-15
        相关资源
        最近更新 更多