gpt4 book ai didi

c - 在 C 中获取文件大小的正确方法

转载 作者:太空狗 更新时间:2023-10-29 11:28:57 25 4
gpt4 key购买 nike

我正在做一个套接字编程作业,我必须在 sparc 和 linux 机器之间发送一个文件。在以字符流发送文件之前,我必须获取文件大小并告诉客户端。以下是我尝试获取尺寸的一些方法,但我不确定哪种方法合适。

出于测试目的,我创建了一个内容为“test”的文件(空格+(字符串)test)

方法 1 - 使用 fseeko() 和 ftello()

这是我在https://www.securecoding.cert.org/confluence/display/c/FIO19-C.+Do+not+use+fseek()+and+ftell()+to+compute+the+size+of+a+regular+file上找到的方法虽然 fssek() 有一个问题“将文件位置指示器设置为文件结尾,与 fseek(file, 0, SEEK_END) 一样,对于二进制流具有未定义的行为”,据说 fseeko() 已经解决了这个问题,但它只适用于 POSIX 系统(这很好,因为我使用的环境是 sparc 和 linux)

fd = open(file_path, O_RDONLY);
fp = fopen(file_path, "rb");
/* Ensure that the file is a regular file */
if ((fstat(fd, &st) != 0) || (!S_ISREG(st.st_mode))) {
/* Handle error */
}
if (fseeko(fp, 0 , SEEK_END) != 0) {
/* Handle error */
}
file_size = ftello(fp);
fseeko(fp, 0, SEEK_SET);
printf("file size %zu\n", file_size);

此方法工作正常并正确获取大小。但是,它仅限于常规文件。我试图用谷歌搜索“常规文件”一词,但我仍然不太了解它。而且我不知道这个功能对我的项目是否可靠。

方法 2 - 使用 strlen()

由于最大。我项目中的一个文件大小是 4MB,所以我可以调用一个 4MB 的缓冲区。之后,文件被读入缓冲区,我尝试使用 strlen 来获取文件大小(或更准确地说是内容的长度)。由于 strlen() 是可移植的,我可以改用这种方法吗?代码片段是这样的

fp = fopen(file_path, "rb");
fread(file_buffer, 1024*1024*4, 1, fp);
printf("strlen %zu\n", strlen(file_buffer));

这个方法也有效并返回

strlen 8

但是网上没看到有类似的方法使用这个方法。所以我在想,也许我错过了什么,或者这种方法有一些我没有意识到的局限性。

最佳答案

普通文件意味着它没有像设备、套接字、管道等那样特殊,而是“普通”文件。看来根据您在发送之前的任务描述,您必须检索普通文件的大小。所以你的方法是对的:

FILE* fp = fopen(...);
if(fp) {
fseek(fp, 0 , SEEK_END);
long fileSize = ftell(fp);
fseek(fp, 0 , SEEK_SET);// needed for next read from beginning of file
...
fclose(fp);
}

但是你可以在不打开文件的情况下做到这一点:

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

struct stat buffer;
int status;

status = stat("path to file", &buffer);
if(status == 0) {
// size of file is in member buffer.st_size;
}

关于c - 在 C 中获取文件大小的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35390912/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com