통계 구조를 사용하여 두 파일의 파일 블록 크기를 얻고 싶습니다.
인터넷에서는 파일 블록 크기가 사용되는 장치에 영향을 받는다고 합니다.
이것이 맞다면 동일한 파티션에 있는 모든 파일의 블록 크기가 동일합니까?
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
struct 필드를 사용합니다 stat
. 이 필드는 파일이 차지하는 512바이트 블록 수를 알려줍니다. 나는 당신 st_blksize
이 프로그램에서 이 필드를 사용하고 싶어한다고 생각합니다.