Linux 文件追加操作
Linux File Append Operation
谁能解释一下 linux 上的文件追加一般是如何工作的?
例如:
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) 大小的百分之几。如果您的操作很少(可能还有大文件),那么我不会担心闪存磨损。
谁能解释一下 linux 上的文件追加一般是如何工作的?
例如:
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) 大小的百分之几。如果您的操作很少(可能还有大文件),那么我不会担心闪存磨损。