如何在C中收缩文件?例如,如果我打开一个2mb文件,做一些工作并决定只有1mb的文件应该仍然存在,这是如何完成的?我知道如何使用write(fd,....)来写入文件,但是如果我想在文件中间划出某些部分或截断它呢?
答案 0 :(得分:6)
您可能正在寻找truncate()
ftruncate()
或Windows SetEndOfFile()
。没有办法“剪掉”文件的一部分,你需要从前面重写它然后截断它。
答案 1 :(得分:3)
几乎每个真实系统都提供了一些截断文件的方法,但C标准没有在标准库中提供它。
这意味着您可以做的就是定义一个函数来完成工作,并为您关心的每个目标实现该功能(例如,在Windows上它将调用SetEndOfFile
,在类Unix系统上它会调用ftruncate
等。)
编辑:只是为了澄清:这只适用于问题的“或截断”部分。大多数文件系统都没有提供“在文件中间创建某些部分”的任何内容。如果要从文件中间删除内容,通常需要重写整个文件,或者自己处理。后者通常适用于某种类似数据库的结构,其中实际上不会从文件中间删除数据;相反,您可以创建类似索引的内容,告诉您关注的数据的位置,并在删除它们时简单地将零件标记为不再使用。如果/稍后添加数据,那么这些部分可以重新使用。在少数情况下,你将有一个“压缩”功能,它接受这样一个数据库并重写它以消除死区(但是,你又回到了重写文件)。
答案 2 :(得分:2)
如果文件足够小以适应RAM,您可以读取该文件,并仅重写必要的东西(即,读取文件,关闭文件,在写入模式下再次打开文件,写下必要的内容) , 关)。如果没有,您可以创建第二个文件,在其中写入,然后删除第一个文件并重命名第二个文件。
我的观点是,没有直接的方法可以删除中间文件的某些部分。
答案 3 :(得分:2)
如果要将文件的先前内容保留到某个长度(长度大于零),则POSIX会为作业提供truncate()和ftruncate()函数。
#include <unistd.h>
int ftruncate(int fildes, off_t length);
int truncate(const char *path, off_t length);
名称表示主要目的 - 缩短文件。但是如果指定的长度比前一个长度长,则文件会增加(零填充)到新的大小。请注意,ftruncate()适用于文件描述符,而不是您可以使用的FILE *;
:
if (ftruncate(fileno(fp), new_length) != 0)
...错误处理......
但是,为了您的目的,可能只需要打开截断即可。
答案 4 :(得分:2)
您有两种选择:
答案 5 :(得分:1)
如果您有POSIX系统,请查看ftruncate()
。
答案 6 :(得分:1)
其他人已经回答了如何截断文件。但是,删除文件中间的部件是不可能的。为此,您需要重写整个文件。