【发布时间】:2015-07-24 20:39:22
【问题描述】:
谁能解释一下文件附加在linux上的一般工作原理是什么?
例如:
1.
以追加模式打开文件
写入文件
关闭文件
- 以附加模式打开文件
写入文件
关闭文件
当执行上面的第二个操作时,文件是否会被附加而不被实际删除?
上述操作的执行方式会影响闪光灯的磨损。
【问题讨论】:
谁能解释一下文件附加在linux上的一般工作原理是什么?
例如:
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 可能会占用实际(磁盘/闪存)大小的百分之几。如果您的操作很少(可能还有大文件),那么我不会担心闪存磨损。
【讨论】:
当执行上面的第二个操作时,文件是否只是 附加而不实际被删除?
文件/流打开操作在 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() 了解更多信息。
【讨论】: