【问题标题】:How do you write to a file without changing its ctime?如何在不更改 ctime 的情况下写入文件?
【发布时间】:2020-04-09 19:01:24
【问题描述】:

我希望只使用类似的东西

with open(file_name, "w") as f:

如果文件已经存在,则不会更改 ctime。不幸的是,它确实如此。 有没有可以保持 ctime 不变的版本?

动机: 我有一个包含事件列表的文件。我想知道最古老的事件是多少岁。看来这应该是ctime的文件。

【问题讨论】:

  • 可以设置新建文件的修改时间:stackoverflow.com/questions/1158076/…
  • @hek2mgl ctime 在里面吗?我只看到 atime 和 mtime。
  • 你确定你说的是ctime吗?大多数 Linux 文件系统不公开 ctime
  • @BasileStarynkevitch 好吧,也许我误解了 ctime 的作用。你愿意解释一下吗?看来修改检测应该用mtime来做吧?

标签: python linux


【解决方案1】:

动机:我有一个包含事件列表的文件。我想知道最古老的事件是多少岁。看来这应该是ctime的文件。

这是sqlite 数据库的完美用例(或者甚至可能是PostGreSQL 数据库,如果您的应用程序可以在多个 Linux 主机上运行 - 共享一个公共数据库服务器 - 或在不同的 Linux 进程中运行),或至少一个GDBM 索引文件。顺便说一句,究竟 是您的应用程序的事件,每个事件在文件中是如何表示的?如果您使用任何relational database,请将您的精力投入到足够好的database schema 设计上,了解database normalization 并巧妙地设计合适的database indexes

我会在该文件或数据库中注册每个事件,并使用 explicit 事件添加时间。请参阅time(7) 了解更多信息。

也许您正在考虑大量数据(数 TB)。然后还要查看this 的答案。

请注意,您的处理器比您的磁盘(甚至是 SSD)要快得多。实际上,您的文件数据的很大一部分可能位于 page cache 中(因此获得更多 RAM 可以显着提高性能)。

另请参阅 https://www.linuxatemyram.com/http://norvig.com/21-days.html 以获得有用的见解。

如果性能对您来说真的很重要,请考虑在某些编译语言实现中重新编码您的应用程序(C++ 与 GCCRustOcamlSBCLGo....)。它们中的大多数都比 Python 快得多。

请注意,磁盘空间比 CPU 时间便宜,这比开发人员的时间和精力要便宜。

【讨论】:

    【解决方案2】:

    注意,ctime 不是创建时间,而是 inode 更改时间。每次写入文件或更改其元数据时都会更新它,例如重命名它。所以我们有:

    • atime : 访问时间 - 每次读取文件时
    • mtime : 修改时间 - 每次更改文件数据(写入文件)
    • ctime : change 时间 - 每次在文件中更改某些内容时,数据或元数据(如名称或(硬)链接)

    我不知道如何重置 ctime 字段,因为即使 utimes 及其变体也只能设置 atime 和 mtime(以及支持它的文件系统的出生时间,如 BSD UFS2) - 当然除了更改系统时间之外所涉及的警告...

    【讨论】:

      【解决方案3】:

      不幸的是,没有。您可以在不更改文件 ctime 的情况下对文件执行的所有操作就是读取它。您所能做的就是设置 ctime,尽管这也不是微不足道的。您必须更改系统时间,然后触摸文件,然后将系统时间重置为当前时间。

      看看thisthis

      编辑:

      我说的是 Unix 系统,正如标签中的 OP 所述

      【讨论】:

      【解决方案4】:

      因为fopen 在使用 'w' 作为选项时会以这种方式工作。来自手册:

      "w" write:为输出操作创建一个空文件。
      如果已存在同名文件,则丢弃其内容,并将该文件视为新的空文件。

      如果您不想创建新文件,请使用a+ 附加到文件中。这使创建日期保持不变。

      【讨论】:

      • 如何清除旧文件内容?
      • @Sarien:您可以拨打file.truncate(0)
      • 好吧,w 应该按照 Python 手册执行此操作。我认为这就是这里的问题
      • @hek2mgl:这不是这个答案中引用的文档所说的。
      • @martineau 正确。不知道这是从哪里引用的。官方手册在这里:docs.python.org/3.5/library/functions.html#open
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-15
      • 2022-08-02
      • 2014-11-29
      • 1970-01-01
      相关资源
      最近更新 更多