Linux 中的文件块大小是多少?

Linux 中的文件块大小是多少?

我想使用 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在程序中使用该字段。

相关内容