linux获取目录下文件大小的问题
2012-09-02 17:16
369 查看
代码如下:
void list_dir(char *path)
{
DIR *dir;
struct dirent *entry;
struct stat stat_buf;
if ((dir = opendir(path)) == NULL)
{
printf("cannot open dir:%s\n", path);
return;
}
while ((entry = readdir(dir)) != NULL)
{
lstat(entry->d_name, &stat_buf);
if (!S_ISDIR(stat_buf.st_mode))
printf("%s, %d", entry->d_name, (int)stat_buf.st_size);
}
closedir(dir);
}
结果打印出来的是这种结果:
httpd-2.4.2.tar.gz, 4096
Firefox-latest.exe, 4096
Makefile.pdf, 4096
cr-SecureCRT.rar, 4096
putty.exe, 4096
结果显示大小都是4096,有时候只是其中一个文件的大小比如,都是xxx文件的大小,那个4096应该是目录"."和".."的大小,这就很奇怪了,为什么打印出来的不是自身文件的大小。
后来没办法用以下方法获取文件大小:
FILE *fp = fopen(name, "r");
if (fp)
{
fseek(fp, 0L, SEEK_END);
int len = ftell(fp);
fseek(fp, 0L, SEEK_SET);
return len;
}
但是使用标准的c函数来获取文件大小有个问题,就是一般能够获取出小文件的大小,但是有的大文件就无法获取出大小,因为标准C的文件操作函数不支持对超过2G的文件读取。
至于为什么用stat_buf.st_size获取的大小有问题,还没有搞清楚原因。
经过网上搜索及测试,终于发现了stat_buf.st_size获取的大小有问题的原因了。
原因解释:linux下目录保存的并不是文件本身,在 Linux 下,目录保存的实际是"文件名"+inode。inode 是到文件系统的元数据(文件的类型,大小,所有者,权限,等等)的索引。文件系统就好比一个大仓库,文件就好比保存在该仓库中的各种货物,而目录呢,就好比仓库门口的货物清单(及其在仓库中的位置等信息)。显然在清单里面并没有包含货物本身,而你获取清单本身的大小(就如同你获取目录的大小一样)同样无法获取清单里面所列物品的大小。
所以上述用stat_buf.st_size获取目录下文件大小的代码需要作如下修改:
void list_dir(char *path)
{
DIR *dir;
struct dirent *entry;
struct stat stat_buf;
if ((dir = opendir(path)) == NULL)
{
printf("cannot open dir:%s\n", path);
return;
}
while ((entry = readdir(dir)) != NULL)
{
char tmp[100];
strcpy(tmp, path);
strcat(tmp, entry->d_name);
lstat(tmp, &stat_buf);
if (!S_ISDIR(stat_buf.st_mode)) {
printf("%s, %d", entry->d_name, (int)stat_buf.st_size);
}
}
closedir(dir);
}
void list_dir(char *path)
{
DIR *dir;
struct dirent *entry;
struct stat stat_buf;
if ((dir = opendir(path)) == NULL)
{
printf("cannot open dir:%s\n", path);
return;
}
while ((entry = readdir(dir)) != NULL)
{
lstat(entry->d_name, &stat_buf);
if (!S_ISDIR(stat_buf.st_mode))
printf("%s, %d", entry->d_name, (int)stat_buf.st_size);
}
closedir(dir);
}
结果打印出来的是这种结果:
httpd-2.4.2.tar.gz, 4096
Firefox-latest.exe, 4096
Makefile.pdf, 4096
cr-SecureCRT.rar, 4096
putty.exe, 4096
结果显示大小都是4096,有时候只是其中一个文件的大小比如,都是xxx文件的大小,那个4096应该是目录"."和".."的大小,这就很奇怪了,为什么打印出来的不是自身文件的大小。
后来没办法用以下方法获取文件大小:
FILE *fp = fopen(name, "r");
if (fp)
{
fseek(fp, 0L, SEEK_END);
int len = ftell(fp);
fseek(fp, 0L, SEEK_SET);
return len;
}
但是使用标准的c函数来获取文件大小有个问题,就是一般能够获取出小文件的大小,但是有的大文件就无法获取出大小,因为标准C的文件操作函数不支持对超过2G的文件读取。
至于为什么用stat_buf.st_size获取的大小有问题,还没有搞清楚原因。
经过网上搜索及测试,终于发现了stat_buf.st_size获取的大小有问题的原因了。
原因解释:linux下目录保存的并不是文件本身,在 Linux 下,目录保存的实际是"文件名"+inode。inode 是到文件系统的元数据(文件的类型,大小,所有者,权限,等等)的索引。文件系统就好比一个大仓库,文件就好比保存在该仓库中的各种货物,而目录呢,就好比仓库门口的货物清单(及其在仓库中的位置等信息)。显然在清单里面并没有包含货物本身,而你获取清单本身的大小(就如同你获取目录的大小一样)同样无法获取清单里面所列物品的大小。
所以上述用stat_buf.st_size获取目录下文件大小的代码需要作如下修改:
void list_dir(char *path)
{
DIR *dir;
struct dirent *entry;
struct stat stat_buf;
if ((dir = opendir(path)) == NULL)
{
printf("cannot open dir:%s\n", path);
return;
}
while ((entry = readdir(dir)) != NULL)
{
char tmp[100];
strcpy(tmp, path);
strcat(tmp, entry->d_name);
lstat(tmp, &stat_buf);
if (!S_ISDIR(stat_buf.st_mode)) {
printf("%s, %d", entry->d_name, (int)stat_buf.st_size);
}
}
closedir(dir);
}
相关文章推荐
- Linux下获取文件大小,检索目录函数
- Linux下获取文件大小,检索目录函数
- Linux 命令行获取文件或目录的大小
- 解决Linux下Tomcat日志目录下的catalina.log日志文件过大的问题
- Asp.Net_文件操作基类(读取,删除,批量拷贝,删除,写入,获取文件夹大小,文件属性,遍历目录)
- Linux更改文件及目录权限问题
- Asp.Net 文件操作基类(读取,删除,批量拷贝,删除,写入,获取文件夹大小,文件属性,遍历目录)
- java通用工具类 ---获取目录文件大小
- Linux 查看目录大小及文件数量命令
- linux 文件大小ll和du不一致问题
- 获取目录中某个文件的大小
- linux查看文件和目录大小(du)
- linux下获取文件大小
- linux设置磁盘配额查看目录文件大小命令
- [问题-已解决]arm-none-linux-gnueabi-gcc没有那个文件或目录
- Linux下的C++程序:统计一个目录及其内部文件总共占据的空间大小
- Asp.Net 文件操作基类(读取,删除,批量拷贝,删除,写入,获取文件夹大小,文件属性,遍历目录)
- linux下用gcc编译c程序时遇到的问题: error: stdio.h: 没有那个文件或目录
- linux下使用 du查看某个文件或目录占用磁盘空间的大小方法
- 查看linux文件目录的大小和文件夹包含的文件数