Для тех, кто ищет полное решение для поиска последнего файла в папке:
Если ваш FTP-сервер поддерживает команду MLSD
, решение легко:
entries = list(ftp.mlsd())
entries.sort(key = lambda entry: entry[1]['modify'], reverse = True)
latest_name = entries[0][0]
print(latest_name)
Если вам нужно полагаться на устаревшую команду LIST
, вы должны проанализировать ее листинг, который он возвращает.
Общий список * nix выглядит следующим образом:
-rw-r--r-- 1 user group 4467 Mar 27 2018 file1.zip
-rw-r--r-- 1 user group 124529 Jun 18 15:31 file2.zip
С таким списком этот код будет делать:
from dateutil import parser
# ...
lines = []
ftp.dir("", lines.append)
latest_time = None
latest_name = None
for line in lines:
tokens = line.split(maxsplit = 9)
time_str = tokens[5] + " " + tokens[6] + " " + tokens[7]
time = parser.parse(time_str)
if (latest_time is None) or (time > latest_time):
latest_name = tokens[8]
latest_time = time
print(latest_name)
Это довольно хрупкий подход.
Более надежный, но менее эффективный способ - это используйте команду MDTM
для получения временных меток отдельных файлов / папок:
names = ftp.nlst()
latest_time = None
latest_name = None
for name in names:
time = ftp.sendcmd("MDTM " + name)
if (latest_time is None) or (time > latest_time):
latest_name = name
latest_time = time
print(latest_name)
Некоторые FTP-серверы поддерживают собственный нестандартный переключатель -t
для NLST
(или LIST
) команда.
lines = ftp.nlst("-t")
latest_name = lines[-1]
См. Как получить файлы в папке FTP, отсортированные по времени модификации .
Независимо от того, какой подход вы используете, latest_name
, вы загружаете его как любой другой файл:
file = open(latest_name, 'wb')
ftp.retrbinary('RETR '+ latest_name, file.write)
См. также Получите последнее имя папки FTP в Python .
Есть ли причина, по которой можно создавать ссылки на ссылки на ссылку
blockquote>null
в Java?Это не так, но, видимо, в Eclipse есть ошибка в этом отношении (править: с тех пор как исправлено ). Согласно спецификации, и когда вы используете инструменты JDK, он не работает с NPE на линии
Runnable fn = test::m;
.Доказательство: http://ideone.com/APWXna (или компилировать и запускать его локально с помощью
javac
иjava
, а не Eclipse)Теория: из JLS §15.13.3 :
Во-первых, если ссылочное выражение метода начинается с ExpressionName или Primary , это подвыражение оценивается. Если подвыражение оценивается как
blockquote>null
, возникаетNullPointerException
, и выражение ссылки метода заканчивается внезапно.(Мой акцент.)