截断文件

时间:2009-02-25 03:47:58

标签: c windows winapi

我正在使用fopen fseeko64 ftello64 fclose等来操作文件。

如何截断文件?我知道在C中没有标准的方法可以做到这一点。我想要的是一些适用于任何win32平台的方法。我正在使用mingw gcc进行编译。

请注意:我的意思是将文件的大小截断为指定的大小,而不是将其大小调整为0。并且使用像复制部件这样的技巧到另一个文件并删除/重命名是不合适的。

5 个答案:

答案 0 :(得分:17)

SetEndOfFile()

获取具有写访问权限的文件句柄,设置文件指针,然后调用SetEndOfFile()。

- 亚当

答案 1 :(得分:5)

如果要将文件截断为零大小,可以使用fopen标记"w"

FILE *fh = fopen("file.txt","w");
if (fh != NULL) fclose(fh);

要在标准C中截断到特定大小,可以使用传输/重命名解决方案执行此操作,例如:

FILE *finp = fopen ("inp.txt", "rb");       // should check for NULLs
FILE *fout = fopen ("out.txt", "wb");

size_t sz = 100000;                         // 100,000 bytes
char *buff = malloc (sz);                   // should check for NULL

sz = fread (buff, 1, sz, fin);              // should check for errors
fwrite (buff, 1, sz, fout);

free (buff);

fclose (fin);
fclose (fout);

rename ("out.txt", "inp.txt);               // should check for error

当然,如果您可以访问Win32标头和库(我相信MinGW会为您提供此功能),您可以使用SetEndOfFile(),因为它可以使用它,而不必创建新文件然后重命名它。

这意味着使用基于Windows句柄的文件I / O而不是基于C FILE*,但是,如果你无论如何都要限制自己,那可能并不重要。另一方面,如果您想要可移植性,则需要基于标准C的解决方案,例如上面的传输/重命名解决方案。

答案 2 :(得分:4)

对于基于文件的文件操作,请使用_fileno()和_chsize_s()来更改文件的大小。

int changesize(FILE *fp, __int64 size)
{
    int filedes = _fileno(fp);
    return _chsize_s(filedes, size);
}

可以通过验证提供的大小是否小于当前文件大小来编写截断版本,因为_chsize_s()将截断或扩展文件的大小 - 请参阅http://msdn.microsoft.com/en-us/library/whx354w1(VS.80).aspx

答案 3 :(得分:2)

如果你只是fopen()一个带有"w"参数的文件,它将被截断。

http://www.cplusplus.com/reference/clibrary/cstdio/fopen.html

答案 4 :(得分:1)

如前所述,您可以将fopen()与“w”标志一起使用,如:

FILE *f = fopen("file.txt", "w");

此外,如果您已经打开了文件,则可以使用函数freopen(),再次使用“w”标志:

FILE *f = fopen("file.txt", "r");  //initial fopen() call
...
f = freopen("file.txt", "w", f);   //reopens "file.txt" and truncates it

http://www.cplusplus.com/reference/clibrary/cstdio/freopen.html

编辑:在看到你编辑了你的OP后,我不会重新发布Pax和Adam Davis已经提出的内容。另外,我将确认Pax说的是,MinGW确实允许您访问Win32标头。