两种方法获取文件大小:fseek与stat

需积分: 9 2 下载量 201 浏览量 更新于2024-09-21 收藏 5KB TXT 举报
"这篇文章主要介绍了如何在C语言中获取文件的大小,提供了两种不同的方法:一种是使用标准I/O库中的`fseek`和`ftell`函数,另一种是使用系统调用`stat`。这两种方法都可以有效地获取文件的字节数。" 在计算机编程中,特别是涉及到文件操作时,有时我们需要知道文件的大小,以便于处理或分配内存。本文将详细阐述两种在C语言中读取文件大小的方法。 1. 使用`fseek`和`ftell`: 这段代码首先打开文件(以只读模式“r”),然后使用`fseek`将文件位置指针移动到文件末尾,接着使用`ftell`获取当前位置,即文件的大小。最后关闭文件并返回文件大小。这种方法简单直接,但仅适用于可以被正常打开并读取的文件,且不考虑文件的特殊属性(如符号链接)。 ```c unsigned long get_file_size(const char* path) { unsigned long file_size = -1; FILE* fp; fp = fopen(path, "r"); if (fp == NULL) return file_size; fseek(fp, 0L, SEEK_END); file_size = ftell(fp); fclose(fp); return file_size; } ``` 2. 使用`stat`系统调用: `stat`是一个强大的系统调用,它可以获取文件的各种元数据,包括文件大小。通过传递文件路径和一个`struct stat`缓冲区,`stat`函数会填充缓冲区的信息。在成功调用后,`st_size`成员就是文件的大小。这种方法不仅可以获取文件大小,还可以获取其他如文件类型、权限、修改时间等信息。 ```c #include <sys/stat.h> unsigned long get_file_size(const char* path) { unsigned long file_size = -1; struct stat stat_buff; if (stat(path, &stat_buff) < 0) { return file_size; } else { file_size = stat_buff.st_size; } return file_size; } ``` 需要注意的是,`stat`系统调用可能失败,因此需要检查返回值。如果返回值小于0,表示调用失败,通常是因为文件不存在或没有权限访问。在成功的情况下,`st_size`字段包含文件的字节数。 此外,`stat`家族还包括`fstat`,它与`stat`类似,但作用于已打开的文件描述符,以及`lstat`,用于处理符号链接,不会递归地解析链接目标。 总结来说,C语言中获取文件大小有两种常见方法:一是通过标准I/O库,二是通过系统调用。每种方法都有其适用场景,选择哪种取决于具体需求,如是否需要获取更多文件元信息或者处理符号链接。在实际编程中,应根据项目需求和性能考虑来决定使用哪种方法。