2016-04-27 35 views
2

Pythonとftplibを使用して、FTPディレクトリ内の項目がファイルかディレクトリかをチェックする汎用関数を作成します。 MLSD機能を使用することは必ずしもすべてのサーバで機能するわけではないかもしれません(私の使用例の1つはそれを提供しません)。このディレクトリをオブジェクトに変更しようと試みることによって、この効果的ですが粗雑な方法で解決しました。例外が発生し、ファイルタイプがそれに応じて設定されます。FTPサーバ上のオブジェクトがPythonとftplibを使用しているファイルかディレクトリかを確認する

私は他の方法についてインターネットとライブラリのドキュメントを吟味しましたが、ほとんどの場合に動作するものは見つかりませんでした。

たとえば、dir関数を使用すると、最初の文字が'd'であるかどうかを確認できますが、これによって決定される可能性がありますが、すべての出力が同じ形式であるわけではありません。

私がこの方法で見ることができる最大の欠陥は、指定したフォルダにディレクトリを変更する権限がない場合です。したがって、ファイルとして扱われます。

私には何かがありませんか、これを行うにきれいな方法はありますか?

答えて

1

ftplibだけでなく、一般的なFTPプロトコルを使っても良い方法はありません。

MLST/MLSDは、唯一の正確で信頼できる方法です。

MLST/MLSDを使用できない場合は、CWDを試してください。

パーズしようとすると、LISTがフォールバックのオプションです。しかし、サーバーがあなたのプログラムが理解できるリスト形式を使用していることを知る必要があります。

0

ここでは、FTPサーバーのFTPバージョンos.walkで使用した機能を紹介します。ここでは、完全なコードhttps://github.com/Kasramvd/FTPwalkを見たい場合はgithubのリンクです:

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で使っているのと同じように行うことはできないので、ASCII転送モードでファイルまたはディレクトリのリストを取得する関数ftplib.FTP.retrlines()を使う必要があります。そして、これらの行を解析してディレクトリを分離することができます。

関連する問題