我想使用 stat 结构获取两个文件的文件块大小。
在互联网上,他们说文件块大小受到使用的设备的影响。
如果这是正确的,同一分区中所有文件的块大小是否相等?
我正在使用 blockcmp 函数,它总是返回相同的大小。我想知道这是对的还是我错过了什么。
这是我的代码。
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <time.h>
struct stat stat1, stat2;
struct tm *time1, *time2;
void filestat1(void);
void filestat2(void);
void filetime1(void);
void filetime2(void);
void sizecmp(void);
void blockcmp(void);
void datecmp(void);
void timecmp(void);
int main(void)
{
filestat1();
filestat2();
filetime1();
filetime2();
sizecmp();
blockcmp();
datecmp();
timecmp();
}
void filestat1(void)
{
// check if there is no text1
int check = 0;
check = stat("text1", &stat1);
if(check != 0)
{
printf("Error : there is no text1\n");
}
return;
}
void filestat2(void)
{
// check if there is no text2
int check = 0;
check = stat("text2", &stat2);
if(check != 0)
{
printf("Error : there is no text2\n");
}
return;
}
void filetime1(void)
{
time1 = localtime(&stat1.st_mtime);
return;
}
void filetime2(void)
{
time2 = localtime(&stat2.st_mtime);
return;
}
void sizecmp(void)
{
printf("size compare\n");
//variable declare
long long int text1_size;
long long int text2_size;
//variable initialize
text1_size = stat1.st_size;
text2_size = stat2.st_size;
if(text1_size > text2_size)
printf("text1 is bigger\n");
else if(text1_size < text2_size)
printf("text2 is bigger\n");
else
printf("same size\n");
printf("\n");
return;
}
void blockcmp(void)
{
printf("block compare\n");
//variable declare
long long int text1_block_size;
long long int text2_block_size;
//variable initialize
text1_block_size = stat1.st_blocks;
text2_block_size = stat2.st_blocks;
if(text1_block_size > text2_block_size)
printf("text1 is bigger\n");
else if(text1_block_size < text2_block_size)
printf("text2 is bigger\n");
else
printf("same size\n");
printf("\n");
return;
}
void datecmp(void)
{
printf("date compare\n");
// compare tm_mon
if(time1->tm_mon > time2->tm_mon)
printf("time1 is early \n");
else if(time1->tm_mon < time2->tm_mon)
printf("time2 is early \n");
else{
// compare tm_mday
if(time1->tm_mday > time2->tm_mday)
printf("time1 is early \n");
else if(time1->tm_mday < time2->tm_mday)
printf("time2 is early \n");
// same date
else
printf("same time \n");
}
printf("\n");
}
void timecmp(void)
{
printf("time compare\n");
// compare hour
if(time1->tm_hour > time2->tm_hour)
printf("time1 is early \n");
else if(time1->tm_hour < time2->tm_hour)
printf("time2 is early \n");
else{
// compare minutes
if(time1->tm_min > time2->tm_min)
printf("time1 is early \n");
else if(time1->tm_min < time2->tm_min)
printf("time2 is early \n");
// same time
;else
printf("same time \n")
}
}
`
答案1
st_blksize
返回的字段给出stat()
了“高效文件系统 I/O 的首选块大小”。 (来自stat
手册页)。该值应解释为提示您应以该大小的倍数向文件读取和写入数据,以实现高效的 I/O。正如您所说,它依赖于存储设备,也可以依赖于文件系统。它可以大于硬件设备的逻辑块大小,但通常受到 CPU 内存页大小的限制。硬盘上的逻辑块大小通常为 512 或 4096 字节,光学介质上的逻辑块大小通常为 2048 字节。
顺便说一下,您的代码使用了结构st_blocks
体的字段stat
。该字段告诉文件占用了多少个 512 字节块。我猜您想st_blksize
在程序中使用该字段。