如何防止在 Python 中使用 FTPLIB 覆盖现有文件?
Posted
技术标签:
【中文标题】如何防止在 Python 中使用 FTPLIB 覆盖现有文件?【英文标题】:How to Prevent Overwriting a Existing File Using FTPLIB in Python? 【发布时间】:2014-07-24 09:49:00 【问题描述】:我制作了一个 python 程序,它将用户输入的数据存储在 sqlite 数据库中。我想把它上传到 ftp 服务器。我尝试在 python 中使用 ftplib。这里,所有使用该程序的用户的数据库文件名都是相同的。
这里,我的问题是
如果user1上传文件到ftp服务器,下一个user2上传。文件被覆盖。我怎样才能阻止这种情况?
公平地说:如何停止覆盖现有文件并重命名 ftpserver 中的当前(要上传的文件)文件。那么,我会有这两个文件吗?
【问题讨论】:
不清楚您想如何命名目标(在您的情况下为 FTP 服务器)上的文件。请提供更多详细信息。 如果文件存在,我不想覆盖它。而不是我想附加'1',这样它就会像filename1。 看看我的解决方案是否可以满足您的需求。恐怕只在文件名末尾使用一个数字可能仍然会导致一个用户覆盖另一个用户的文件,因此您最好考虑一种更强大的命名算法。 【参考方案1】:在上传前使用ftplib.mlsd() 列出目录。如果给定文件已经存在,则不要上传。
注意这一点——如果两个人同时上传,用户 A 仍有可能上传并覆盖用户 B。
【讨论】:
谢谢。但是,我想将这两个文件都放在我的 ftpserver 中。 我建议在 FTP 服务器上为每个用户创建一个目录。每个用户上传到他自己的干净目录。然后您可以扫描不同的目录,将文件移动到真正的输出目录中。 在这种情况下我可以有多个同名目录吗? 没有。您可以编写或自定义您自己的 FTP 服务器,该服务器在幕后为每个用户写入不同的目录,但这听起来……很棘手。考虑重述项目的假设和目标,然后创建另一个 *** 问题。你会得到更清晰的答案:) 感谢您的宝贵建议。可能会询问用户的电子邮件并将其用作 email.db 是更好的选择。因为没有 2 个用户拥有相同的电子邮件。【参考方案2】:您的问题缺乏细节(其中包括:您使用的是什么版本的 Python、您使用的是什么操作系统,以及最关键的是所复制文件的命名方案应该是什么)。
我假设每个客户端程序都使用一个名为“userdata.db”的 SQLite 文件,并且您要确保在 FTP 服务器上每个副本都由用户名标识。
所以 User:Pamar 将在 ftp 服务器上拥有 userdata.db.pamar,而 User:Lucy 将以 userdata.db.lucy 结束
(我希望你有办法确保没有两个用户的名字相同,顺便说一句)。
我能想到的最简单的解决方案是:
使用shutil 使用所需名称制作数据库的临时(本地)副本,通过 FTP 传输,然后将其删除。
即,对于用户 Pamar,您将拥有:
第一步:复制/userhome/pamar/userdata.db -> /userhome/pamar/userdata.db.pamar 第二步:FTP传输/userhome/pamar/userdata.db.pamar -> FTPServer 第三步:删除/userhome/pamar/userdata.db.pamar它不是很优雅,在复制完成之前,你会在(本地)文件系统上使用一些额外的空间,如果 userdata.db 特别大,这可能是一个问题(但你可能不会使用 sqlite首先)。
【讨论】:
我在windows xp下使用python 2.7。完成后,我将使用 cx-feeze 使其可执行。我的程序结构如下: Main.db With Table - Lukcy(id, name, username, password) 用户登录后,它会创建一个文件夹数据库,因为它会创建一个带有 username.db 的 db 文件我想上传这个username.db 文件到 ftp 服务器。我的问题是我将通过互联网将程序分发给其他人。没有办法在所有这些中检查用户名。它在系统内部进行测试,每个帐户只允许一个唯一的用户名。 用户之间缺乏唯一ID恐怕是一个设计缺陷。当您的用户第一次运行程序时,是否有机会通过生成和存储 ID 来解决这个问题?就像您在其他答案的 cmets 中建议的那样使用电子邮件。以上是关于如何防止在 Python 中使用 FTPLIB 覆盖现有文件?的主要内容,如果未能解决你的问题,请参考以下文章