Linux 文件追加操作

Linux File Append Operation

谁能解释一下 linux 上的文件追加一般是如何工作的?

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

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

当执行上面的第2个操作时,文件是否只是追加而没有真正被删除?

以上操作的方式会影响flash的磨损

When the 2nd operation is performed above, will the file be just appended without actually being erased?

File/Stream 打开操作在 Linux 中实现,使用 fopen() 来执行所需的操作。有关详细信息,请参阅 man 3 fopen

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

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

附加的 2 种模式是:-

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

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

Opening a file in append mode (a as the first character of mode) causes all subsequent write operations to this stream to occur at end-of-file, as if preceded the call:

 fseek(stream, 0, SEEK_END);

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

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

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

在任何 *nix 系统上擦除文件意味着删除 inode(这只是指向 disk/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: -

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