Linux获取文件大小汇总

最近纠结一个问题,Linux下如何获取文件的大小,查了一下,方法汇总如下:
1.利用fseek和ftell
2.利用fstat和fileno
下面我们就详细说一下介绍一下。

1.利用fseek和ftell获取文件的大小

1.1fseek、ftell介绍

int fseek(FILE *stream, long offset, int whence);
功能:该函数是将文件指针移到指定的位置。
参数:stream表示用fopen打开的文件HANDLE(入参)
            offset表示文件指针的偏移位置(入参)
            whence表示从何处偏移(入参)。whence有三种选项,分别代表:
                                                                          SEEK_SET:从文件开头偏移offset个byte;
                                                                          SEEK_CUR:从文件当前位置偏移offset个byte;
                                                                          SEEK_END:从文件末尾偏移offset个byte;
返回值:成功为0,失败为-1;

long ftell(FILE *stream);
功能:获取文件指针从文件开始到当前位置的偏移量。
参数:stream表示用fopen打开的文件HANDLE(入参)
返回值:成功就返回偏移量;失败为-1.

1.2如何获取文件大小?

主要思路是这样的:首先利用fseek将文件指针指向文件末尾,然后利用ftell获取文件的当前位置。

1.3测试程序

#include <stdio.h>   // FILE...

// get the file size.
long getfilesize(FILE *pFile)
{
        // check FILE*.
        if( pFile == NULL)
        {
                return -1;
        }

        // get current file pointer offset.
        long cur_pos = ftell(pFile);
        if(cur_pos == -1)
        {
                return -1;
        }

        // fseek to the position of file end.
        if(fseek(pFile, 0L, SEEK_END) == -1)
        {
                return -1;
        }

        // get file size.
        long size = ftell(pFile);

        // fseek back to previous pos.
        if(fseek(pFile, cur_pos, SEEK_SET) == -1)
        {
                return -1;
        }

        // deal returns.
        return size;
}
int main()
{
        // open a file.
        FILE *pFile = fopen("./Test.txt", "a");
        if(pFile == NULL)
        {
                printf("error.\n");
                return 0;
        }

        // get the file size.
        printf("the file size: %ld\n", getfilesize(pFile));

        // close the file.
        fclose(pFile);

        return 0;
}

2.利用fstat和fileno

2.1fileno和fstat介绍

int fileno(FILE *stream);
功能:将stream转化为整数描述符。
参数:stream表示用fopen打开的文件HANDLE(入参)
返回值:成功返回stream的整数描述符;失败返回-1.

int fstat(int filedes, struct stat *buf);
功能:通过文件描述符filedes获取该文件信息
参数:filedes表示文件描述符(入参)
            buf表示文件信息结构的指针(出参)。struct stat的具体信息可以查看(http://www.cnitblog.com/guopingleee/archive/2008/11/13/51411.aspx)
返回值:成功返回0;失败返回-1.

2.2如何获取文件大小?

首先利用fileno将“FILE *”型的HANDLE转化为文件的整数描述符,然后获取文件的信息(其中包含文件大小)。

2.3测试程序

#include <sys/stat.h>// stat
#include <stdio.h>   // FILE...

// get the file size.
off_t getfilesize(FILE *pFile)
{
        // check FILE*.
        if( pFile == NULL)
        {
                return -1;
        }

        // get file size.
        int fd=fileno((FILE *)pFile);
        if(fd == -1)
        {
                return -1;
        }
        struct stat fileStat;
        if( -1 == fstat(fd, &fileStat))
        {
                return -1;
        }

        // deal returns.
        return fileStat.st_size;
}
int main()
{
        // open a file.
        FILE *pFile = fopen("./Test.txt", "a");
        if(pFile == NULL)
        {
                printf("error.\n");
                return 0;
        }

        // get the file size.
        printf("the file size: %ld\n", getfilesize(pFile));

        // close the file.
        fclose(pFile);

        return 0;
}

后记:
获取文件大小的方法还有很多,本文主要是从fopen得到的文件句柄出发,汇总一下方法。
GitHub 加速计划 / li / linux-dash
6
1
下载
A beautiful web dashboard for Linux
最近提交(Master分支:3 个月前 )
186a802e added ecosystem file for PM2 4 年前
5def40a3 Add host customization support for the NodeJS version 4 年前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐