【问题标题】:Linux File Append OperationLinux 文件追加操作
【发布时间】:2015-07-24 20:39:22
【问题描述】:

谁能解释一下文件附加在linux上的一般工作原理是什么?

例如:
1.
以追加模式打开文件
写入文件
关闭文件

  1. 以附加模式打开文件
    写入文件
    关闭文件

当执行上面的第二个操作时,文件是否会被附加而不被实际删除?

上述操作的执行方式会影响闪光灯的磨损。

【问题讨论】:

    标签: linux file append


    【解决方案1】:

    第二个操作不会擦除(第一个)文件。 但它确实移动了第二个文件的数据。

    在任何 *nix 系统上擦除文件意味着删除 inode(它只是指向磁盘/ssd/flash 上文件实际开始位置的指针。)实际数据不会被覆盖或甚至感动。

    inode 数据示例如下所示:

    $ stat file.sh 
      File: ‘file.sh’
      Size: 289         Blocks: 8          IO Block: 4096   regular file
    Device: 813h/2067d  Inode: 528981      Links: 1
    Access: (0755/-rwxr-xr-x)  Uid: (    0/    root)   Gid: (    0/    root)
    Access: 2015-07-24 13:06:57.806899456 +0200
    Modify: 2015-07-24 13:06:54.822899376 +0200
    Change: 2015-07-24 13:06:54.822899376 +0200
     Birth: -
    

    是否影响闪存磨损取决于文件大小;如果您有许多非常小的文件和大量操作,那么 inode 可能会占用实际(磁盘/闪存)大小的百分之几。如果您的操作很少(可能还有大文件),那么我不会担心闪存磨损。

    【讨论】:

      【解决方案2】:

      当执行上面的第二个操作时,文件是否只是 附加而不实际被删除?

      文件/流打开操作在 Linux 中使用fopen() 实现,用于执行所需的操作。请参阅man 3 fopen 了解更多信息。

      FILE *fopen(const char *path, const char *mode);
      

      fopen() 函数打开名称为 path 指向的字符串的文件,并与它关联一个流。

      追加的两种模式是:-

      a ----- 打开以进行附加(写入文件末尾)。如果文件不存在,则创建该文件。流位于文件的末尾。

      a+ ----- 打开用于读取和附加(写入文件末尾)。如果文件不存在,则创建该文件。读取的初始文件位置在文件开头,但输出始终附加到文件末尾。

      以追加模式打开文件(a 作为模式的第一个字符) 导致对该流的所有后续写入操作发生在 文件结尾,就像在调用之前一样:

       fseek(stream, 0, SEEK_END);
      

      此外,打开现有文件进行追加和创建不存在文件的最佳方法是对 fopen() 进行两次单独调用。第一个调用尝试附加到文件。如果失败(当 fopen() 返回 0 时),请尝试使用 "w" 模式打开文件。

      查看this link on Append or Create a File Using fopen() 了解更多信息。

      【讨论】:

        猜你喜欢
        • 2011-03-11
        • 2017-03-19
        • 1970-01-01
        • 1970-01-01
        • 2017-05-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多