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