C语言 stat()函数获得文件大小需不需要打开文件?就是stat()函数是怎么获得文件的大小的?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言 stat()函数获得文件大小需不需要打开文件?就是stat()函数是怎么获得文件的大小的?相关的知识,希望对你有一定的参考价值。

C语言
stat()函数获得文件大小需不需要打开文件?就是stat()函数是怎么获得文件的大小的?

stat函数不需要,只要文件名就行(你的文件在当前路径下,要不还需将路径名加上),int state(const char * path,struct stat *buf);这是函数原型。在struct state这个结构体中有个st_size这个变量,他就是文件大小的变量。具体你可以查一下man手册。与它类似的还有一个fstat,他需要open文件得到文件描述符。追问

想问的是stat是如何得到文件大小的?就是它具体是怎样实现的?

追答

每个文件都有一个inode节点,在这个节点中包含了这个文件的所有信息。至于inode节点的结构体信息可以在内核中获得。当你通过文件名的时候,系统就会根据inode节点中的信息填写到struct state这个结构中。stat这个系统调用的具体实现,参考内核。

追问

要是文件的大小为4G,系统是32位的,看inode可以知道文件的大小吗?

追答

我觉得这个与文件的大小没什么关系哈,它里面只有个参数表示这个文件的大小。并不是将文件全放入内存中。所以不必要考虑32位机是否能寻址4G以上的内存。

loff_t i_size; /* 以字节为单位的文件大小 */
这个变量,在inode结构中表示着文件的大小。

追问

那inode本身又是如何得到文件的大小的?

参考技术A 请参看<linux内核完全注释>一书关于stat.c那一章.此书网上有,是国人赵炯博士写的,对C语言,操作系统的学习有极大的帮助. 参考技术B 不需要 只需要看inode里面的信息就可以追问

要是文件的大小为4G,系统是32位的,看inode可以知道文件的大小吗?

追答

没有办法直接看inode
只能在程序里面用函数来读取
可以读取文件的大小

追问

那inode本身又是如何得到文件的大小的?

C语言文件IO操作的一些其它函数

stat 函数

 1 1 #include <sys/stat.h> 
 2  2 #include <unistd.h> 
 3  3 #include <stdio.h>  
 4  4 int main() 
 5  5 {    
 6  6     struct stat buf;
 7  7     stat("1.c", &buf);
 8  8     printf("1.c file size = %d\n",(int)buf.st_size); 
 9  9     return 0;
10 10 }

文件执行结果
1.c file size = 868

struct stat {
    dev_t         st_dev;       //文件的设备编号
    ino_t         st_ino;       //节点
    mode_t        st_mode;      //文件的类型和存取的权限
    nlink_t       st_nlink;     //连到该文件的硬连接数目,刚建立的文件值为1
    uid_t         st_uid;       //用户ID
    gid_t         st_gid;       //组ID
    dev_t         st_rdev;      //(设备类型)若此文件为设备文件,则为其设备编号
    off_t         st_size;      //文件字节数(文件大小)
    unsigned long st_blksize;   //块大小(文件系统的I/O 缓冲区大小)
    unsigned long st_blocks;    //块数
    time_t        st_atime;     //最后一次访问时间
    time_t        st_mtime;     //最后一次修改时间
    time_t        st_ctime;     //最后一次改变时间(指属性)
};

2. fstat 函数
int fstat(int fd,struct stat *sbuf); //fd是打开的文件描述符,sbuf是存储stat结构体信息的

3. lstat 函数 // lstat类似于stat,但是命名的文件是一个符号链接时,lstat返回的是该链接符号的有个信息,而不是由该符号链接引用的文件信息!

4. dup和dup2函数
 1 #include <unistd.h>
 2 #include <sys/stat.h>
 3 #include <fcntl.h>
 4 #include <stdio.h>
 5 #include <stdlib.h>
 6 #include <string.h>
 7 
 8 int main(void)
 9 {
10         int fd, save_fd;
11         char msg[] = "This is a test\n";
12 
13         fd = open("somefile", O_RDWR|O_CREAT, S_IRUSR|S_IWUSR);
14         if(fd<0)
15         {
16                 perror("open");
17                 exit(1);
18         }
19         save_fd = dup(STDOUT_FILENO);//记录标准输出
20         dup2(fd, STDOUT_FILENO);//标准输出重定向到fd
21         close(fd);
22         write(STDOUT_FILENO, msg, strlen(msg));//标准输出输出到fd指向的文件
23         dup2(save_fd, STDOUT_FILENO);//标准重定向返回来
24         write(STDOUT_FILENO, msg, strlen(msg));//写入缓冲区,此时从屏幕输出
25         close(save_fd);
26         return 0;
27 }

 

  5.symlink 函数

    //用来创建符号链接的

1 #include<unistd.h>
2 int symlink(const char *actualpath,const char *sympath);

 

以上是关于C语言 stat()函数获得文件大小需不需要打开文件?就是stat()函数是怎么获得文件的大小的?的主要内容,如果未能解决你的问题,请参考以下文章

C 语言文件操作 ( 使用 fread 和 fwrite 实现二进制文件的拷贝 | stat 统计文件大小 | feof 判定文件结尾 )

C语言文件IO操作的一些其它函数

c语言高手们请问一下-stat这个怎么用行么?

perl中stat函数怎么计算文件的大小

在c语言中怎样打开一个文本文档

C 语言编程 — stat 文件操作