如何使用FTPLIB在Python中防止覆盖现有文件?

0 投票
2 回答
2090 浏览
提问于 2025-04-18 08:29

我写了一个Python程序,可以把用户输入的数据存储到一个sqlite数据库里。我想把这个数据库上传到FTP服务器。我尝试过用Python里的ftplib来实现。这里,所有使用这个程序的用户数据库文件名都是一样的。

我的问题是:

如果用户1把文件上传到FTP服务器,然后用户2再上传,文件就会被覆盖。我该怎么解决这个问题呢?

简单来说,我想知道怎么才能防止覆盖已有的文件,并且把当前要上传的文件在FTP服务器上重命名,这样我就能保留这两个文件了。

2 个回答

0

你的问题缺少一些细节,比如你用的是哪个版本的Python,你的操作系统是什么,还有最重要的是,复制的文件应该怎么命名。

我假设每个客户端程序都使用一个叫“userdata.db”的SQLite文件,而你想确保在FTP服务器上,每个复制的文件都能通过用户名来识别。

比如,用户Pamar在FTP服务器上的文件名会是userdata.db.pamar,而用户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)。

1

在上传文件之前,可以使用 ftplib.mlsd() 这个方法来查看文件夹里的内容。如果你要上传的文件已经存在,那就不要再上传了。

要注意这一点——如果有两个人同时在上传文件,用户A可能会上传文件并覆盖用户B的文件。

撰写回答