安全的原子文件复制操作

2024-02-07

我需要将文件从一个位置复制到另一个位置,如果文件已存在于目的地(不覆盖),我需要抛出异常(或至少以某种方式识别)。

我可以首先使用 os.path.exists() 检查,但极其重要的是,不能在检查和复制之间的短时间内创建文件。

是否有一种内置的方法可以做到这一点,或者有没有一种方法可以将操作定义为原子操作?


There is事实上,有一种方法可以原子地、安全地做到这一点,前提是所有演员都以同样的方式做。这是一个改编无锁打地鼠算法 http://www.cl.cam.ac.uk/techreports/UCAM-CL-TR-697.pdf#page=66,而且并非完全微不足道,因此请随意选择“否”作为一般答案;)

该怎么办

  1. 检查文件是否已经存在。如果有就停下来。
  2. 生成唯一ID https://docs.python.org/2/library/uuid.html#uuid.uuid4
  3. 将源文件复制到目标文件夹,并使用临时名称,例如,<target>.<UUID>.tmp.
  4. Rename the copy <target>-<UUID>.mole.tmp.
  5. Look for any other files matching the pattern https://docs.python.org/2/library/glob.html <target>-*.mole.tmp.
    • 如果他们的 UUID 比你的大,尝试删除它 https://docs.python.org/2/library/os.html#os.remove。 (如果它消失了,请不要担心。)
    • 如果他们的 UUID 小于您的,请尝试删除您自己的。 (再次强调,如果它消失了,请不要担心。)从现在开始,将他们的 UUID 视为您自己的 UUID。
  6. 再次检查目标文件是否已存在。如果是这样,请尝试删除您的临时文件。 (如果它消失了,请不要担心。记住您的 UUID 可能在第 5 步中已更改。)
  7. 如果您尚未在第 6 步中尝试将其删除,请尝试将临时文件重命名为其最终名称,<target>。 (如果它消失了,不用担心,只需跳回步骤 5。)

你完成了!

怎么运行的

想象每个候选源文件都是一个从洞里钻出来的鼹鼠。中途,它会停下来,将任何竞争的鼹鼠打回地面,然后检查是否有其他鼹鼠完全出现。如果你在脑子里仔细想一想,你应该会发现只有一颗鼹鼠能够一路逃出去。为了防止该系统活锁 https://en.wikipedia.org/wiki/Deadlock#Livelock,我们添加了总排序,即哪只鼹鼠可以攻击哪只鼹鼠。嘭! 博士论文无锁算法 https://en.wikipedia.org/wiki/Non-blocking_algorithm#Lock-freedom.

Step 4 may look unnecessary—why not just use that name in the first place? However, another process may "adopt" your  mole  file in step 5, and make it the winner in step 7, so it's very important that you're not still writing out the contents! Renames on the same file system are atomic, so step 4 is safe.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

安全的原子文件复制操作 的相关文章

随机推荐

  • 在Java中为单链表创建新节点

    我仍在学习 Java 目前正在解决 破解编码面试 中的问题 第 2 章 LinkedList 中的问题之一要求从未排序的链表中删除重复项 我在 GitHub 上找到了一堆答案 解决方案 但我想创建自己的 Node 并编写自己的版本 到目前为
  • C# 退出使用 lambda 的泛型 ForEach

    有谁知道是否可以退出使用 lambda 的通用 ForEach 例如 someList ForEach sl gt if sl ToString foo break continue processing sl here some proc
  • 如何从 CFMutableDictionary 检索特定键的值

    In C EventType find 1 gt second可用于查找键 1 的值 我是 Objective C 的新手 我已经实现了CFDictionary为其增加价值 但是我该怎么办 retreive并查看values特定键的 EDI
  • SQL Server通讯协议问题

    我正在使用 VSTS 2008 C ADO Net SQL Server 2008 我对 SQL Server 2008 将使用哪种通信协议的问题 我的问题的更多详细信息 如果连接字符串看起来像这样 是否使用命名管道或 TCP IP 使用不
  • Vue index.html favicon 问题

    我正在使用 Vue 2 0 和 Vue CLI 3 0 我试图让 favicon ico png 文件正常工作 但一点运气都没有 我已将问题缩小到以下范围 由yarn build生成的index html文件转换了这行html代码 to 如
  • 创建我的第一个 JDBC Realm(Glassfish V3)

    我想为我的 Web 应用程序创建一个 JDBC 领域 由于我的用户彼此之间非常不同 我只需要一个表 其中包含领域的用户名和密码 我决定在我的数据库中创建一个名为 ROLE 的新表 与其他用户表的一对一关系 This is how my us
  • 如何知道应用程序正在关闭

    有一个 WPF 应用程序 我想在应用程序关闭时记录 但我无法修改应用程序 一些限制 只是因为业务 因此 我在现有应用程序中创建了一个不可见的表单组件 添加为 dll 库 因此不需要修改现有应用程序 但问题是 我的隐形组件如何知道应用程序正在
  • 上传前预览多张图片

    我想预览多个图像 但问题是如果我上传 2 个图像 我的代码就可以工作 我想预览与用户上传的一样多的内容 这是我的 JavaScript var abc 0 Declaring and defining global increement v
  • C#:获取域中计算机的信息

    为了获取网络中某台计算机的信息 我应该在 C 中使用哪些类 例如谁登录了该计算机 该计算机上正在运行什么操作系统 打开了哪些端口等 查看系统管理 http msdn microsoft com en us library system ma
  • TableTools 导出在多个 JQuery 选项卡上的 DataTables 中不起作用

    我使用 DataTables 1 8 2 TableTools 2 0 1 和 JQuery 1 6 4 在三个 jQuery 选项卡上分别显示一个表格 TableTools 为表格提供了复制 Excel PDF 打印导出功能 并且仅适用于
  • 描述符的 Python 文档字符串

    我使用描述符来定义接口类的寄存器 class Register object def init self address docstring instance docstring self address address self doc
  • 当你没有在 ruby​​ 中指定异常类时,你会捕获哪些异常?

    当您不指定这样的异常类时 您会捕获哪些异常 begin do something rescue puts Exception end 根据我的副本Ruby 编程 1 9 不带参数的救援子句被视为具有参数StandardError 这是来自的
  • 如何在 Windows 中安装适用于 Python 3.4 的 pandas?

    根据the docs http pandas pydata org pandas docs dev install html 这应该有效 从 PyPI 安装 pandas 可以通过 PyPI 中的 pip 安装 点安装熊猫 这可能需要安装许
  • TypeScript:在事件中使用 jquery $(this)

    HTML div div
  • 对每个请求执行代码

    我希望能够对每个将数据填充到 ViewData 的请求执行一些代码 目前 我有一个基本控制器类 我的所有控制器都继承自该类 并且我重写 OnActionExecuting 并在那里执行它 我对这种方法唯一关心的是 创建新控制器的人必须继承基
  • 在事件处理程序中发送不带 XHR 的 http 请求

    如何使用 javascript 作为事件处理程序通过 post get 方法发送 http 请求 谢谢 保罗 好吧 你不想使用 Ajax 您可以使用事件处理程序来提交表单 a href send a
  • Salesforce PhoneGap iPhone 应用程序中的 oAuth2 问题(远程访问应用程序授权问题)

    我使用 PhoneGap 创建了一个 iPhone 应用程序 我遵循了本教程中的代码 构建由 Database com 提供支持的 PhoneGap 移动应用程序 http wiki developerforce com page Buil
  • Android listview - 获取自定义列表视图的文本

    我正在开发一个应用程序 在其中创建了一个自定义列表视图 列表视图xml代码如下
  • 使用 Python 实现 AutoCAD 自动化

    我对 Python 和 AutoCAD 非常陌生 所以请耐心等待 我正在尝试使用 Python 来自动化 AutoCAD 中的设计周期 到目前为止 我可以通过 Python 在 AutoCAD 中添加点和线 但我希望能够将线型更改为虚线 我
  • 安全的原子文件复制操作

    我需要将文件从一个位置复制到另一个位置 如果文件已存在于目的地 不覆盖 我需要抛出异常 或至少以某种方式识别 我可以首先使用 os path exists 检查 但极其重要的是 不能在检查和复制之间的短时间内创建文件 是否有一种内置的方法可