Как предотвратить перезапись существующего файла с помощью FTPLIB в Python?

Я сделал программу на Python, которая хранит введенные пользователем данные в базе данных sqlite. Я хочу загрузить его на ftp-сервер. Я попытался использовать ftplib в python. Здесь имя файла базы данных одинаково для всех пользователей, использующих программу.

Вот моя проблема

Если пользователь 1 загружает файл на ftp-сервер, а следующий пользователь 2 загружает его. Файл перезаписывается. Как я могу остановить это?

Честно: как я могу остановить перезапись существующего файла и переименовать текущий (файл, который будет загружен) файл на ftpserver. Итак, что у меня будут эти 2 файла?


person 7H3 IN5ID3R    schedule 03.06.2014    source источник
comment
Непонятно, как вы хотите назвать файлы в месте назначения (в вашем случае FTP-сервер). Пожалуйста, предоставьте более подробную информацию.   -  person p.marino    schedule 04.06.2014
comment
Если файл существует, я не хочу перезаписывать его. Вместо этого я хочу добавить «1», чтобы это было похоже на имя файла1.   -  person 7H3 IN5ID3R    schedule 04.06.2014
comment
Посмотрите, подходит ли мое решение для ваших нужд. Я боюсь, что простое использование числа в конце имени файла может привести к тому, что один пользователь перезапишет файл другим, поэтому вам лучше подумать о более надежном алгоритме именования.   -  person p.marino    schedule 04.06.2014


Ответы (2)


Используйте ftplib.mlsd(), чтобы перечислить каталог перед загрузка. Если данный файл уже существует, не загружайте его.

Будьте осторожны с этим - если два человека загружают одновременно, пользователь А все еще может загрузить и перезаписать пользователя Б.

person johntellsall    schedule 03.06.2014
comment
Спасибо вам. Но я хочу иметь оба файла на своем ftpserver. - person 7H3 IN5ID3R; 04.06.2014
comment
Я предлагаю создать каталог для каждого пользователя на FTP-сервере. Каждый пользователь загружает в свой собственный, чистый каталог. Затем вы можете сканировать разные каталоги, перемещая файлы в реальный выходной каталог. - person johntellsall; 04.06.2014
comment
В этом случае у меня может быть несколько каталогов с одинаковым именем? - person 7H3 IN5ID3R; 04.06.2014
comment
Нет. Вы можете написать или настроить свой собственный FTP-сервер, который за кулисами пишет в разные каталоги для каждого пользователя, но это звучит... сложно. Подумайте о пересмотре предположений и целей вашего проекта, а затем создайте еще один вопрос StackOverflow. Вы получите более четкие ответы :) - person johntellsall; 04.06.2014
comment
Спасибо за ценное предложение. Может запрашиваться электронная почта пользователя, и использование ее в качестве email.db является лучшим выбором. Потому что нет двух пользователей с одинаковым адресом электронной почты. - person 7H3 IN5ID3R; 04.06.2014

В вашем вопросе отсутствуют детали (среди прочего: какую версию Python вы используете, на какой ОС вы работаете и, что наиболее важно, какая должна быть схема именования для скопированных файлов).

Я предполагаю, что каждая клиентская программа использует файл SQLite с именем «userdata.db», и что вы хотите убедиться, что на FTP-сервере каждая копия идентифицируется по имени пользователя.

Таким образом, пользователь: Pamar будет иметь userdata.db.pamar на ftp-сервере, а пользователь: Lucy получит userdata.db.lucy.

(Надеюсь, у вас есть способ убедиться, что у двух пользователей нет одинаковых имен, кстати).

Самое простое решение, которое я могу придумать, это:

Используйте shutil, чтобы создать временную (локальную) копию базы данных с нужным именем. , передайте его по FTP, затем удалите.

То есть, в случае с пользователем Pamar у вас будет:

  • Шаг 1: Скопируйте /userhome/pamar/userdata.db -> /userhome/pamar/userdata.db.pamar
  • Шаг 2: FTP-передача /userhome/pamar/userdata.db.pamar -> FTPServer
  • Шаг 3. Удалите файл /userhome/pamar/userdata.db.pamar.

Это не очень элегантно, и вы будете использовать некоторое дополнительное пространство в (локальной) файловой системе, пока копирование не будет завершено, и это может быть проблемой, если userdata.db особенно велик (но тогда вы, вероятно, не будете использовать sqlite в первом место).

person p.marino    schedule 03.06.2014
comment
Я использую Python 2.7 под Windows XP. Я сделаю его исполняемым с помощью cx-feeze, как только закончу. Структура моей программы выглядит следующим образом: Main.db With Table - Lukcy (id, name, username, password) После входа пользователя в систему он создает базу данных папок, в которой создается файл db с username.db. Я хочу загрузить это файл username.db на ftp-сервер. Моя проблема в том, что я буду распространять программу другим людям через Интернет. Невозможно проверить имя пользователя среди них всех. Он тестируется внутри системы и допускает только одно уникальное имя пользователя для каждой учетной записи. - person 7H3 IN5ID3R; 04.06.2014
comment
Боюсь, отсутствие уникальных идентификаторов у пользователей — это недостаток дизайна. Есть ли шанс решить эту проблему, создав и сохранив идентификатор, когда ваш пользователь запускает программу в первый раз? Например, использовать электронную почту, как вы предлагаете в комментариях к другому ответу. - person p.marino; 04.06.2014