本文介绍了安全地重命名文件而不覆盖的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述 29岁程序员,3月因学历无情被辞! 我想重命名一个文件,但前提是目标文件名不存在已经存在。 我可以这样做: $跳过文件,引发异常,进行备份... do_something_else() else: os.rename(src,dest) 但是在多用户系统上,有可能dest在检查是否存在和尝试重命名之间的 时间段内创建。 有什么方法可以防止这种情况发生吗?或者我只是试着把支票和 重命名尽可能地靠近,最大限度地减少机会和 希望最好的? - 史蒂文。 解决方案 1:用os.open打开文件 2:独占锁定文件 - 其他进程现在无法访问 it。 3:使用重命名重命名文件;这会导致文件系统级别 隐藏旧文件的取消链接(它从文件 系统中消失)但是打开过程仍然可以访问它。 4:关闭文件 - 锁被移除,重命名 敲定。 Wolfgang Draxinger - 电子邮件地址有效,Jabber:他****** @ jabber。组织,ICQ:134682867 GPG密钥FP:2FC8 319E C7D7 1ADC 0408 65C6 05F5 A645 1FD3 BD3E 1:用os.open打开文件 2:独占锁定文件 - 其他进程现在无法访问 it。 3:使用重命名重命名文件;这会导致文件系统级别 隐藏旧文件的取消链接(它从文件 系统中消失)但是打开过程仍然可以访问它。 4:关闭文件 - 锁被删除,重命名 敲定。 这对新文件有帮助吗? OP正确地假设当他测试文件时会发生一个 竞争条件&然后尝试 创建它,因为在此期间它可能已经创建。 Diez Diez B. Roggisch写道: 使用O_CREAT打开新文件名O_EXCL 标志。对不起,我忘记了明确提到。但是我还没有尝试过它,但它应该可以运行。 Wolfgang Draxinger - 电子邮件地址有效,Jabber: he******@jabber.org ,ICQ:134682867 GPG密钥FP:2FC8 319E C7D7 1ADC 0408 65C6 05F5 A645 1FD3 BD3E I want to rename a file, but only if the destination file name doesn''talready exist.I can do this:if os.path.exists(dest):# skip file, raise an exception, make a backup...do_something_else()else:os.rename(src, dest)But on a multi-user system, it is possible that dest is created in thetime period between checking if it exists and attempting the rename.Is there any way to prevent this? Or do I just try to keep the check andthe rename as close together as possible, minimizing the chances andhoping for the best?--Steven. 解决方案1: Open the file with os.open2: Lock the file exclusively -no other process can now accessit.3: Use rename to rename the file; this causes a file system levelimplicit unlink of the old file (it dissappears from the filesystem) but the opening process can still access it.4: close the file -the lock is removed and the renamefinalized.Wolfgang Draxinger--E-Mail address works, Jabber: he******@jabber.org, ICQ: 134682867GPG key FP: 2FC8 319E C7D7 1ADC 0408 65C6 05F5 A645 1FD3 BD3E1: Open the file with os.open2: Lock the file exclusively -no other process can now accessit.3: Use rename to rename the file; this causes a file system levelimplicit unlink of the old file (it dissappears from the filesystem) but the opening process can still access it.4: close the file -the lock is removed and the renamefinalized.Where does that help for new files? The OP was right in assuming that arace condition could occur when he tests for a file & then tries tocreate it, as in the meantime it could have been created.DiezThe open is to happen on the new file name with O_CREAT | O_EXCLflags. Sorry, I forgot that to mention explicitly. However Ihave not tried it yet, but it should work.Wolfgang Draxinger--E-Mail address works, Jabber: he******@jabber.org, ICQ: 134682867GPG key FP: 2FC8 319E C7D7 1ADC 0408 65C6 05F5 A645 1FD3 BD3E 这篇关于安全地重命名文件而不覆盖的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持! 上岸,阿里云!
08-01 01:32