2016-06-30 10 views
0

Ich arbeite mit Python3 und ftplib.python3 ftplib: überprüfe, ob dir per mlsd() existiert

Ich muss überprüfen, ob ein Verzeichnis auf dem FTP-Server existiert. (wenn nicht, kann ich es schaffen, als cwd hinein, wenn es schon existiert, werde ich direkt in es hineinzwängen). How to make Python check if ftp directory exists?

if 'foo' in [name for name, data in list(remote.mlsd())]:

Problem da dies löst auch 'foo' genannt auf Dateien:

Ich habe die Methode von Marek Marecki hier gesehen.

Gibt es einen pythonischen Weg (explizit mit mlsd())? nlst() ist veraltet

Vielen Dank!

+0

'mlsd' hat zweiten Parameter' facts', in dem Sie festlegen können, dass Sie Außerdem möchten Sie Typinformationen abrufen (standardmäßig sind die Fakten leer und 'mlsd' ruft nur Namen ab). Aber ich kann keinen FTP-Server finden, der MLSD-Befehl unterstützt, um es zu überprüfen. – Arnial

+0

hat ein bisschen mehr Forschung und hat es endlich zur Arbeit:

 for name, facts in f.mlsd(".",["type"]): if facts["type"] == "dir" and name == "remote_ftp": print("isdir: "+ name) remotefoldername_exists = 1 break if(remotefoldername_exists == 0) ftp.mkd(remotefoldername) logging.debug("folder does not exitst, ftp.mkd: " + remotefoldername) else: logging.debug("folder did exist: " + remotefoldername) 
edit: Code Formatierung ist ein Schmerz :( –

Antwort

1

Auch dank @arnial

I cam oben mit folgendem: (MLSD oder NSLT)

use_mlsd = 1 
if(use_mlsd): 
    # if ftp server supports mlsd, use it, nlst is maked as deprecated in ftplib 
    # check if remotefoldername exists 
    remotefoldername_exists = 0 
    for name, facts in f.mlsd(".",["type"]): 
    if facts["type"] == "dir" and name == "remote_ftp": 
     print("isdir: "+ name) 
     remotefoldername_exists = 1 
     break 
    if(remotefoldername_exists == 0) 
    ftp.mkd(remotefoldername) 
    logging.debug("folder does not exitst, ftp.mkd: " + remotefoldername) 
    else: 
    logging.debug("folder did exist: " + remotefoldername) 

else: 
    # nlst legacy support for ftp servers that do not support mlsd e.g. vsftp 
    items = [] 
    ftp.retrlines('LIST', items.append) 
    items = map(str.split, items) 
    dirlist = [ item.pop() for item in items if item[0][0] == 'd' ] 
    #print("directrys", directorys) 
    #print('remote_ftp' in directorys) 
    if not (remotefoldername in dirlist): 
     ftp.mkd(remotefoldername) 
     logging.debug("folder does not exitst, ftp.mkd: " + remotefoldername) 
    else: 
     logging.debug("folder did exist: " + remotefoldername) 
0

Ich habe keinen Server, der MLSD-Befehl unterstützt, also bin ich nicht sicher, wie dies mit MLSD. Aber dieser Code sollte auch ohne MLSD-Unterstützung funktionieren.

items = [] 
    ftp.retrlines('LIST', items.append) 
    items = map(str.split, items) 
    directorys = [ item.pop() for item in items if item[0][0] == 'd' ] 
    print("directrys", directorys) 
    print('foo' in directorys)