統計構造を使用して両方のファイルのファイルブロックサイズを取得したいと思います。
インターネットでは、ファイルブロックサイズが使用されるデバイスの影響を受けると言われています。
これが正しい場合、同じパーティション内のすべてのファイルのブロックサイズは同じですか?
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
プログラムでこのフィールドを使用したいと思います。