Cal*_*Lau 2 c sockets linux filesize
我正在进行socket编程中的一项任务,我必须在sparc和linux机器之间发送一个文件.在char流中发送文件之前,我必须获取文件大小并告诉客户端.以下是我试图获得尺寸的一些方法,但我不确定哪一个是正确的.
出于测试目的,我创建了一个内容为"test"的文件(空格+(字符串)测试)
方法1 - 使用fseeko()和ftello()
这是我在https://www.securecoding.cert.org/confluence/display/c/FIO19-C.+Do+not+use+fseek()+and+ftell()+to+compute+上找到的方法.+大小+ + a +常规+文件 虽然fssek()有一个问题"将文件位置指示器设置为文件结尾,与fseek(文件,0,SEEK_END)一样,但是对于二进制文件有未定义的行为stream",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);
Run Code Online (Sandbox Code Playgroud)
此方法工作正常,并正确获得大小.但是,它仅限于常规文件.我试图谷歌术语"常规文件"但我仍然不太了解它.我不知道这个功能对我的项目是否可靠.
方法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));
Run Code Online (Sandbox Code Playgroud)
此方法也有效并返回
strlen 8
Run Code Online (Sandbox Code Playgroud)
但是,我在使用此方法的Internet上看不到任何类似的方法.所以我想也许我错过了一些东西或者这种方法存在一些限制,我还没有意识到.
常规文件意味着它没有什么特别的设备,套接字,管道等,而是"普通"文件.似乎在发送之前通过您的任务描述必须检索普通文件的大小.所以你的方式是正确的:
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);
}
Run Code Online (Sandbox Code Playgroud)
但你可以在不打开文件的情况下完成:
#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;
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
21756 次 |
最近记录: |